JPA使用相同的复合键字段映射多个表@OneToOne关系

问题描述 投票:0回答:1

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

我有3个表如下:

TABLE_A
-------
SIREN
NDA

TABLE_B
-------
SIREN
NDA

TABLE_C
-------
SIREN
NDA

3个表具有相同的SIREN / NDA,这对夫妇是唯一的,我必须在使用它的表之间导航。

创建此实体的最佳做法是什么?使用SIREN / NDA作为COMPOSITE KEY对象还是应该创建技术PK ID?

java hibernate jpa one-to-one composite-key
1个回答
0
投票

是。如果SIREN / NDA属性对是唯一的,则应该使该对成为复合主键。您给出的示例有三个具有相同属性集的表。在某些情况下,我们会获得这些类型的表,尤其是在数据库模式中的Representing Class Hierarchies中。取决于相关实体之间的不相交和完整性,有两种一般方法。

重叠与不相交(不相交)

不相交 - 子类没有共同的实体

重叠 - 子类至少有一个共同的实体

完全与部分(完整性)

Full - 超类的所有实体都属于至少一个子类。也称为覆盖。

部分 - 超类中至少有一个实体不属于任何一个子类。

第一种方法 - 用于非不相交和非完整的类层次结构

  • 根据正常实体集转换方法为每个超类实体集创建一个表。
  • 为每个子类实体集创建一个表,该表包含该实体集的每个属性的列加上超类实体集的主键的每个属性的一个表
  • 来自超类实体集的该主键也用作该新表的主键

例如,假设以下实体具有属性。主键是粗体样式。

人:[SSN,姓名,性别]

学生:[SSN,Stu_ID,部门,GPA]

员工:[SSN,E_ID,公司,薪资]

在这里,StudentEmployee实体是Person的子类,StudentEmployee子实体都有SSN作为共同属性。所以,它们是不相交的。它们也是非完整的,因为Person超类中可能有条目不属于StudentEmployee这两个子类中的任何一个。

所以在这里,我们为超类实体Person创建一个表,其中SSN是主键。我们还为子类实体StudentEmployee创建表,其中SSN是主键。

第二种方法 - 用于不相交和完整的类层次结构

  • 不要为超类实体集创建表
  • 为每个子类实体集创建一个表,包括该子类实体集的所有属性和超类实体集的属性

例如,假设以下实体具有属性。主键是粗体样式。

车辆:[Vehicle_Id,Make,Price]

机动车:[Vehicle_Id,Engine Cc,Fuel Economy]

自行车:[Bike_Id,Cogs,Chainrings]

在这里,MotorVehicleBicycle实体是MotorVehicle的子类。 CarBicycle子实体没有任何重叠属性。所以,他们是不相交的。它们也是完整的,因为Vehicle超类中的每个条目都必须属于子类MotorVehicleBicycle中的任何一个

所以在这里,我们不为超类实体Vehicle创建一个表。我们只为子类实体MotorVehicleBicycle创建表,其中Vehicle_IdBike_Id分别是主键。它们都包含超类实体的属性。所以这两个表如下。

机动车:[Vehicle_Id,Make,Price,Engine Cc,Fuel Economy]

自行车:[Vehicle_Id,Bike_Id,Make,Price,Cogs,Chainrings]

© www.soinside.com 2019 - 2024. All rights reserved.