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

时间:2017-04-18 08:52:06

标签: java hibernate jpa one-to-one composite-key

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

我有3张表如下:

TABLE_A
-------
SIREN
NDA

TABLE_B
-------
SIREN
NDA

TABLE_C
-------
SIREN
NDA

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

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

1 个答案:

答案 0 :(得分:0)

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

重叠与不相交(不相交)

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

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

完全与部分(完整性)

完整 - 超类的所有实体至少属于其中一个 子类。也称为覆盖。

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

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

  • 为每个超类实体集创建一个表 按照正常的实体集翻译方法。
  • 使用a为每个子类实体集创建一个表 该实体集的每个属性的列 加上一个主键的每个属性 超类实体集
  • 来自超类实体集的这个主键也是 用作此新表的主键

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

  

人:[ SSN ,姓名,性别]

     

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

     

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

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

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

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

  • 不要为超类实体集
  • 创建表
  • 为每个子类实体集创建一个表include all 该子类实体集的属性和属性 超类实体集

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

  

车辆:[ Vehicle_Id ,制作,价格]

     

MotorVehicle:[ Vehicle_Id ,Engine_cc,Fuel_economy]

     

自行车:[ Bike_Id ,Cogs,Chainrings]

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

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

  

MotorVehicle:[ Vehicle_Id ,Make,Price,Engine_cc,Fuel_economy]

     

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