2015-04-20 34 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