Java JPA映射多个表@OneToOne关系和相同的组合键字段

Java JPA映射多个表@OneToOne关系和相同的组合键字段,java,hibernate,jpa,one-to-one,composite-key,Java,Hibernate,Jpa,One To One,Composite Key,这是一个概念性的例子,我正在寻找最好的实现解决方案 我有以下三个表格: TABLE_A ------- SIREN NDA TABLE_B ------- SIREN NDA TABLE_C ------- SIREN NDA 这3个表具有相同的耦合警报器/NDA,这对耦合是唯一的,我必须使用它在表之间导航 创建此实体的最佳实践是什么?使用SIREN/NDA作为复合密钥对象,还是应该创建一个技术PK ID?是。如果SIREN/NDA属性耦合是唯一的,则应将该耦合设置为复合主键。您给出的示例

这是一个概念性的例子,我正在寻找最好的实现解决方案

我有以下三个表格:

TABLE_A
-------
SIREN
NDA

TABLE_B
-------
SIREN
NDA

TABLE_C
-------
SIREN
NDA
这3个表具有相同的耦合警报器/NDA,这对耦合是唯一的,我必须使用它在表之间导航


创建此实体的最佳实践是什么?使用SIREN/NDA作为复合密钥对象,还是应该创建一个技术PK ID?

是。如果SIREN/NDA属性耦合是唯一的,则应将该耦合设置为复合主键。您给出的示例有三个具有相同属性集的表。在某些情况下,我们会得到这些类型的表,特别是在数据库模式中表示类层次结构时。根据相关实体之间的不连续性和完整性,有两种通用方法

重叠与不相交(不相交) 不相交-子类没有共同的实体

重叠-子类至少有一个通用实体

全部与部分(完整性) Full-超类的所有实体至少属于以下一个 子类。也被称为覆盖

部分-超类的至少一个实体没有 属于任一子类

第一种方法-用于非不相交和非完整的类层次结构
  • 为每个超类实体集创建一个表 根据标准实体集的转换方法
  • 为每个具有 该实体集的每个属性的列 加上的主键的每个属性一个 超类实体集
  • 超级类实体集中的这个主键也是 用作此新表的主键
例如,假设以下实体具有属性。主键是粗体的

人员:[strong>SSN,姓名,性别]

学生:[SSN,学生ID,系,GPA]

员工:[SSN,电子身份证,公司,工资]

这里,
Student
Employee
实体是
Person
的子类,
Student
Employee
子实体都具有
SSN
作为公共属性。因此,它们是不相交的。它们也是不完整的,因为
Person
超类中可能存在不属于两个子类
Student
Employee
中任何一个子类的条目

因此,在这里,我们为超类实体
Person
创建一个表,其中
SSN
是主键。我们还为子类实体
Student
Employee
创建表,其中
SSN
是主键

第二种方法-用于不相交和完整的类层次结构
  • 不要为超级类实体集创建表
  • 为每个子类实体集创建一个表,包括所有 该子类实体集的属性和 超类实体集
例如,假设以下实体具有属性。主键是粗体的

车辆:[车辆Id,品牌,价格]

机动车辆:[车辆Id,发动机cc,燃油经济性]

自行车:[自行车Id、齿轮、链环]

这里,
机动车
自行车
实体是
机动车
的子类
Car
Bicycle
子实体没有任何重叠属性。因此,它们是不相交的。它们也是完整的,因为
车辆
超类中的每个条目必须属于
机动车
自行车

所以在这里,我们不为超类实体
Vehicle
创建表。我们仅为子类实体
机动车
自行车
创建表,其中
车辆Id
自行车Id
分别为主键。它们都包含来自超类实体的属性。因此,这两个表如下所示

机动车辆:[车辆Id、品牌、价格、发动机、燃油经济性]

自行车:[车辆Id自行车Id,品牌,价格,齿轮,链环]


是的,您可以为所有三个实体创建相同的组合键,并在映射中选择不同的联接列名称。