2015-04-20 62 views
2

我對Hibernate相對比較陌生,但是我碰到過這個,可能很簡單的問題,但是我無法解決它。我想映射包含java Map字段的實體,它應該(當然)在這個持久化的POJO對象中表現得像java map一樣。爲了簡化問題,我儘可能簡化實體,以便仍然可以認識到主要問題。Hibernate:HashMap <EntityA,EntityB>註解映射

所以總共有3個實體:

EntityA(用作地圖鍵):

@Entity 
@Table(name = "ENTITY_A") 
public class EntityA implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column 
private Long id; 

@Column 
private String valueA; 
} 

EntityB(用作映射值):

@Entity 
@Table(name = "ENTITY_B") 
public class EntityB implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column 
private Long id; 

@Column 
private String valueB; 
} 

MainEntity(含地圖字段):

@Entity 
@Table(name = "MAIN_ENTITY") 
public class MainEntity implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column 
private Long id; 

@OneToMany(fetch=FetchType.EAGER) 
@JoinTable(name="ENTITYA_ENTITYB", 
    [email protected](name="ENTITY_MAIN"), 
    [email protected](name="ENTITY_B", unique=false), 
    [email protected](columnNames = {"ENTITY_MAIN", "ENTITY_A"})) 
@MapKeyJoinColumn(name="ENTITY_A") 
private Map<EntityA, EntityB> entityMap; 
} 

此地圖的註記映射是迄今爲止我找到的最佳解決方案。實際上,除了一個小細節之外,幾乎所有內容都是按照需要的,這種方式持續下去的地圖並不像地圖。因爲當Hibernate在底層數據庫(PostgreSQL)中生成這個連接表時,存在一個有問題的約束(其中包括一些有問題的約束:entity_main和entity_a組合的主鍵,以及3個外鍵的3個主鍵),阻止該映射工作通常:

ALTER TABLE entitya_entityb ADD CONSTRAINT uk_5bbk6m10bx6ru2wh2gtrlpbqr UNIQUE(entity_b); 

這有效地防止此映射從具有用於映射值(而不是隻對一個MainEntity地圖,但對於所有持久映射)相同的對象(EntityB)。所以我不能把相同的EntityB作爲不同的鍵值(EntityA)放在地圖上並保存。我總是得到錯誤這個約束:

ERROR: duplicate key value violates unique constraint "uk_5bbk6m10bx6ru2wh2gtrlpbqr" Detail: Key (entity_b)=(3) already exists. 

我已經試過(如上圖所示),具有獨特= FALSE爲inverseJoinColumns,但沒有運氣。我也嘗試過其他的東西是可能比這多了一個錯誤,所以我不會張貼在這裏: -/

我也將發佈的預期圖片瀏覽,所以我有這樣的更加清晰:

desired join table look

那麼..我做錯了什麼?爲什麼我映射的HashMap不能像簡單的java映射那樣工作?起初我認爲這一定是顯而易見的,因爲任何在Hibernate中映射hashmap的人都會期望map的行爲正確。但後來我發現我實際上無法在SO或其他任何地方找到我的答案。

在此先感謝。

回答

0

如果有人遇到此類問題或類似問題,我最終找到了解決方案。 它實際上是在另一個SO問題中解釋的,但我最初無法找到它。

它只是改變@OneToMany到@ManyToMany註釋的問題: https://stackoverflow.com/a/7637117/1943765