我对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或其他任何地方找到我的答案。
在此先感谢。