Hibernate中如何实现父实体ID共享给关联子实体
你描述的父表子表共享主键的需求,在Hibernate中有两种成熟的实现方案,可根据业务场景选择:
方案1:一对一共享主键关联
适合子实体是独立业务对象、和父实体为一对一关联的场景。
- 先定义父实体类
@Entity @Table(name = "parent") public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "childName") private String childName; // 其他公共字段、getter、setter方法 }
- 再定义子实体类,通过
@MapsId注解直接复用父实体的ID作为子表主键
@Entity @Table(name = "childA") public class ChildA { @Id private Long id; @OneToOne @MapsId @JoinColumn(name = "id") private Parent parent; @Column(name = "childASpecific") private String childASpecific; // 其他子表特有字段、getter、setter方法 }
ChildB的写法和ChildA完全一致,仅需修改对应表名和业务字段即可。
操作时先持久化Parent对象,再将子实体关联已保存的Parent对象后持久化,子表的ID会自动和关联的Parent ID保持一致。
方案2:JOINED继承策略映射
如果ChildA、ChildB业务上属于Parent的子类,更推荐用继承映射实现:
@Entity @Inheritance(strategy = InheritanceType.JOINED) @Table(name = "parent") public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "childName") private String childName; // 公共字段、getter、setter方法 } @Entity @Table(name = "childA") @PrimaryKeyJoinColumn(name = "id") public class ChildA extends Parent { @Column(name = "childASpecific") private String childASpecific; // 子类特有字段、getter、setter方法 } @Entity @Table(name = "childB") @PrimaryKeyJoinColumn(name = "id") public class ChildB extends Parent { @Column(name = "childBSpecific") private String childBSpecific; // 子类特有字段、getter、setter方法 }
该方案下直接保存ChildA或ChildB对象,Hibernate会自动先向parent表插入公共数据,再向对应子表插入特有数据,两张表的ID自动保持一致,无需手动关联。
内容的提问来源于stack exchange,提问作者Nesd
相关产品推荐
相关产品推荐

