2013-09-27 38 views
1

当字符串不是实体映射的关键字时,您可以帮助保存一个地图吗? 例如:JPA:坚持一个地图<字符串,实体>

class A { 

    @Id 
    long id; 

    String code; 
} 

class B { 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @What magical combination of JPA annotations should I use here?! 
    Map<String,A> mapAByCode; 

} 

我已经尝试了很多{@ JoinTable,@ MapKeyColumn,@ JoinColumn,@ JoinTable}注解,但没有成功的组合,我要疯了......

谢谢!

+0

为什么MapKeyColumn不起作用?查看http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/MapKeyColumns获取帮助 – Chris

+0

@MapKeyColumn(name =“CODE”)创建一个映射id主键的字段(名为“CODE”)。 @MapKeyColumn(name =“A_CO​​DE”)不起作用 – acimutal

+0

MapKeyColumn定义关系表中用于存储键值的字段。它用于提供额外的信息。您所需要的只是基于A.code值将您的实体散列在地图中。 – Chris

回答

0

由于您似乎想要使用A.code值映射您的实体,所以@MapKey就是您所追求的。 @MapKey允许你定义参考中的值作为地图的关键。正如javadoc所说的那样,它需要是唯一的,否则你会遇到问题。

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @MapKey(name="code") 
    Map<String,A> mapAByCode; 
+0

我不知道发生了什么事。使用@MapKey(name =“code”)地图数据是错误的反序列化:我获得的地图键是A ID而不是A码。 – acimutal

0

看来这个问题是我使用在同一类与其他地图:

@Entity 
class A { 

    @Id 
    long id; 

    String code; 
} 

@Entity 
class B { 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @JoinTable(name = "B_MAPABYID", joinColumns = @JoinColumn(name = "B_ID")) 
    @MapKey(name="id") 
    Map<Long,A> mapAById; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @JoinTable(name = "B_MAPABYCODE", joinColumns = @JoinColumn(name = "B_ID")) 
    @MapKey(name="code") 
    Map<String,A> mapAByCode; 

} 

这种配置不是为我工作,但如果我设置mapAById瞬态所有作品精细。这对你有意义吗?

+0

由于我无法解决问题,因此我决定将Map更改为map mapAidByCode,并将A实例放入步骤mapAById.get(mapAidByCode.get(“code1”))。我只需使用简单的@ElementCollection注释来定义这个基本类型的映射。 – acimutal

相关问题