2013-09-27 36 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

相關問題