如何映射这样的东西

时间:2012-03-20 15:22:32

标签: hibernate jpa one-to-one

我以前从未见过这样的事情

EntityA
@Id
long id

@Column(name ="field1")
String field1
@Column(name ="field2")
String field2

@IdClass(compositePK.class)
EntityB
@Id
String field1
@Id
String field2

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
EntityA myEntityA

好的一切都很好tableB需要EntityA作为外键,但在field1,field2上的ID上定义。

我收到错误

  

外键(FK74D979395D87E41E:EntityA [id]))必须与引用的主键具有相同的列数(EntityA [field1,field2])

据我所知,hibernate要求FK需要与PK相同但我无法做到entityB PK必须保持field1,field2我无法更改EntityA目前。

1 个答案:

答案 0 :(得分:1)

根据我从您的代码中理解的内容,您使用简单的PK EntityAid EntityB并使用复合PK CompositePK。要使@OneToOne关联起作用,两个实体都需要共享主键/具有相同的PK类(或至少是模拟PK的唯一约束)

这种结构不能使用这种映射,你应该:

  • 一致地调整您的数据模型,以便EntityAEntityB分享他们的PK,或者从EntityBEntityA有一个FK。
  • 使用OneToMany代替,即使它在'many'方面总是包含'one'。

有关背景知识,请参阅Hibernate Reference的这一部分:2.2.5. Mapping entity associations/relationships - One to one,特别是关于FK的第二部分:

  

一对一协会有三种情况:要么是   关联实体共享相同的主键值,即外键   由其中一个实体持有(注意这个FK列中的   数据库应该被约束为模拟一对一的唯一   multiplicity),或关联表用于存储链接   在两个实体之间(必须在每个实体上定义唯一约束)   fk确保一对一的多重性。)