database - JPA如何设计多个表与公用表的一对一关系
问题描述
我有一种情况,很少有表(TableA 和 TableB)与同一个表(TableC)具有一对一的关系。表 A 和表 B 不相关。我设计了如下表格。
TableA
- key
- something
- c_ref_key
TableB
- key
- something
- c_ref_key
TableC
- key
- something
当我使用休眠逆向工程从该数据库生成 JPA 实体时,它会在 TableA 和 TableB 中为 TableC 创建多对一关系。通常要创建一对一的关系,我会将 TableA 主键作为 TableC 的主键,但由于我有其他表(TableB)也与 TableC 具有一对一关系,所以我不能这样做。因此我不得不在 TableA 和 TableB 中使用 TableC 的外键(这导致了 JPA 中的多对一关系)。有没有其他设计方法来保持一对一的关系?或者至少在生成的 JPA 实体中可以有一对一的关系?
解决方案
您可以使用 @OneToOne 休眠映射和 @JoinColumn 来创建外键。以下是 schema 的基本实现,您可以根据需要对其进行扩展。
表A.java
@Entity(name = "TABLE_A")
public class TableA {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long key_a;
private String something;
@OneToOne
@JoinColumn(name = "c_ref_key", referencedColumnName = "key_c")
private TableC c_ref_key;
}
表B.java
@Entity(name = "TABLE_B")
public class TableB {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long key_b;
private String something;
@OneToOne
@JoinColumn(name = "c_ref_key", referencedColumnName = "key_c")
private TableC c_ref_key;
}
表C.java
@Entity(name = "TABLE_C")
public class TableC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long key_c;
private String something;
}
我在 MySql 数据库上测试了这个模式,它工作正常。
推荐阅读
- python - 为什么向后设置(retain_graph=True)会占用大量 GPU 内存?
- php - 获取递归或链表(如表)中当前行的级别,
- scalatra - 如何使用 Scalatra 提供图像
- javascript - 选择器更改基于具有动态列表的先前选择器
- go - 在反向代理中多次重复 http.Request
- vue.js - 使用 vueitify 动态构建 html 颜色增强列表
- reactjs - 导出字典为空
- reactjs - 页面内容在初始加载时不断变化。难道是一切都没有正确呈现?
- javascript - 如何在 url 中添加 wordpress 帖子标题?
- php - mysql中未保留来自textarea的换行符