我以前从未见过这样的事情
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
目前。
答案 0 :(得分:1)
根据我从您的代码中理解的内容,您使用简单的PK EntityA
和id
EntityB
并使用复合PK CompositePK
。要使@OneToOne
关联起作用,两个实体都需要共享主键/具有相同的PK类(或至少是模拟PK的唯一约束)
这种结构不能使用这种映射,你应该:
EntityA
和EntityB
分享他们的PK,或者从EntityB
到EntityA
有一个FK。 OneToMany
代替,即使它在'many'方面总是包含'one'。有关背景知识,请参阅Hibernate Reference的这一部分:2.2.5. Mapping entity associations/relationships - One to one,特别是关于FK的第二部分:
一对一协会有三种情况:要么是 关联实体共享相同的主键值,即外键 由其中一个实体持有(注意这个FK列中的 数据库应该被约束为模拟一对一的唯一 multiplicity),或关联表用于存储链接 在两个实体之间(必须在每个实体上定义唯一约束) fk确保一对一的多重性。)