如何在JPA/Hibernate中单向映射外键在关联表的一对一关系?
问题解决:单向一对一映射(外键在新表B,不修改表A)
错误原因
你用的@JoinTable注解是用来创建中间关联表的,Hibernate会误把表B当成A和B之间的中间关联表,所以它要求B表同时包含A的外键(TABLE_A_ID)和B自身的主键(b_id),但你的B表是实际业务实体表,不存在b_id列,因此触发了schema验证错误。
正确的单向映射实现
不需要双向映射,只需调整A类的注解配置,直接指定外键在B表即可:
class A { // 假设A的主键字段为id,对应表A的主键列id @Id private Long id; @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn( name = "TABLE_A_ID", // B表中存储A主键的外键列名 referencedColumnName = "id",// A表的主键列名 table = "B" // 外键所在的表是B ) private B relation; }
关键说明
- 移除
@JoinTable,改用@JoinColumn并通过table属性明确指定外键位于B表 name对应B表中已存在的外键列名(确保你的B表确实有TABLE_A_ID列,且类型与A的主键匹配)referencedColumnName指定A表的主键列名,若A的主键列名是默认的id,也可以省略该参数(Hibernate会自动推断)- 此配置为纯单向映射,无需在B类中添加任何与A相关的字段或映射注解,完全满足“不修改表A、仅A→B访问”的需求
内容的提问来源于stack exchange,提问作者ProfDrM
相关产品推荐
相关产品推荐

