我對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,但沒有運氣。我也嘗試過其他的東西是可能比這多了一個錯誤,所以我不會張貼在這裏: -/
我也將發佈的預期圖片瀏覽,所以我有這樣的更加清晰:
那麼..我做錯了什麼?爲什麼我映射的HashMap不能像簡單的java映射那樣工作?起初我認爲這一定是顯而易見的,因爲任何在Hibernate中映射hashmap的人都會期望map的行爲正確。但後來我發現我實際上無法在SO或其他任何地方找到我的答案。
在此先感謝。