Hibernate中子表与关联表基于主表的关系配置咨询
在Hibernate中配置A、B、C的关联关系
先明确关联逻辑:
- A与B为一对一关联,B作为A的子表
- B通过A与C建立一对多关联(一个B对应多个C,关联依据是A的主键)
方式一:A与B共享主键(子表复用主表主键)
实体A代码
@Entity @Table(name = "table_a") public class A { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 一对一关联B,维护端在B,这里仅做映射 @OneToOne(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private B b; // 省略getter、setter、构造方法 }
实体B代码
@Entity @Table(name = "table_b") public class B { @Id @Column(name = "a_id") // 直接使用A的主键作为自身主键 private Long id; // 关联A,@MapsId指定复用A的主键 @OneToOne(fetch = FetchType.LAZY) @MapsId @JoinColumn(name = "a_id") private A a; // 通过A的主键关联C,这里不维护C的关联字段,避免数据冲突 @OneToMany(fetch = FetchType.LAZY) @JoinColumn(name = "a_id", referencedColumnName = "id", insertable = false, updatable = false) private List<C> cList; // 省略getter、setter、构造方法 }
实体C代码
@Entity @Table(name = "table_c") public class C { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 外键关联A的主键 @Column(name = "a_id") private Long aId; // 其他业务字段示例 private String content; // 省略getter、setter、构造方法 }
方式二:B使用独立主键+外键关联A
如果B需要独立主键,可修改B的配置:
@Entity @Table(name = "table_b") public class B { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 外键关联A,unique约束保证一对一关系 @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "a_id", unique = true) private A a; // 同样通过A的主键关联C @OneToMany(fetch = FetchType.LAZY) @JoinColumn(name = "a_id", referencedColumnName = "id", insertable = false, updatable = false) private List<C> cList; // 省略getter、setter、构造方法 }
关键说明
- 一对一关联中,
mappedBy指定维护端在B,A无需管理关联字段,避免双向维护导致的冲突 - B关联C时,
insertable=false, updatable=false表示B不负责修改C的a_id字段,由C自身或A维护,保证数据一致性 - 若需要懒加载优化,可设置
fetch = FetchType.LAZY,避免查询B时一次性加载所有C数据
内容的提问来源于stack exchange,提问作者aparajith vangal
相关产品推荐
相关产品推荐

