将记录插入子表时,为什么不使用新记录更新父表(使用每个类策略的表)

时间:2018-05-18 12:11:51

标签: hibernate inheritance

我有一个父实体(User)和两个子实体(注册用户和未注册用户),并且使用TABLE PER CLASS策略在数据库表中实现它。

因此我在数据库中有三个表。因此,当用户注册时,我正在创建注册用户实体并保留它。它在Registered User表中创建一条记录,但它不会在User表(父表)中插入任何记录。

有人可以帮忙解决这个问题吗?

提前致谢。

此致 Nirathan

1 个答案:

答案 0 :(得分:0)

您可能希望重新阅读InheritanceType上的Javadoc。

  1. JOINED
    一种策略,其中特定于子类的字段映射到与父类共有的字段不同的表,并执行连接以实例化子类。
  2. SINGLE_TABLE
    每个类层次结构的单个表
  3. TABLE_PER_CLASS
    每个具体实体类的表
  4. 您所描述的内容是您的期望与JOINED更紧密地对齐。在这种情况下,超类的属性将存储在自己的表中,而子类的属性则单独存储在自己的表中。为了访问完整的行,JPA提供程序必须在所有参与的表中执行 JOIN 以获得完整的行。

    TABLE_PER_CLASS方案中,每个具体实体类型都会有一个表格,在您的情况下会有UserRegisteredUserUnregisteredUser的表格,因为所有3个都是@Entity映射。 JPA提供程序将它们视为单独的实体,但允许您在需要时将多态性用于实体映射。

    在数据库级别,如果查看表格,您会注意到从User继承的列也存在于其他两种类型中。创建子类类型RegisteredUser时,其userName属性将存储在RegisteredUser表中,而不是User表中。

    只有直接创建User,才能将数据存储在User中。