Hibernate 如何绘制这样的地图

Hibernate 如何绘制这样的地图,hibernate,jpa,one-to-one,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) Enti

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

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
Ok all Ok(正常)
表B
需要将
实体A
作为外键,但在id上定义,而不是在
字段1、字段2

我犯了这样的错误

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


我理解hibernate要求FK必须与PK相同,但我无法做到这一点,
entityB
PK必须保持
field1,field2
我暂时无法更改
EntityA

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

无法将此类映射用于此结构,您应该:

  • 一致地调整数据模型,以便
    EntityA
    EntityB
    共享它们的PK,或者有一个从
    EntityB
    EntityA
    的FK
  • 使用一个
    OneToMany
    ,即使它总是在“多”端包含“一”
请参阅Hibernate参考的这一部分了解一些背景知识:,特别是第二部分介绍FK:

一对一关联有三种情况:或者 关联实体共享相同的主键值,即外键 由其中一个实体持有(请注意 数据库应该是唯一的,以模拟一对一 或者使用关联表来存储链接 在两个实体之间(必须在每个实体上定义唯一约束 fk以确保一对一的多重性)


那代码不可读。重新格式化它,以便我们能够阅读和理解它。