【问题标题】:Hibernate Table per concrete class Table behavior每个具体类表行为的休眠表
【发布时间】:2015-10-08 04:18:05
【问题描述】:

比方说,我有一个类 Employee 与字段 employeeIdname。这是由另一个类PermanentEmployee 继承的,其字段为salaryexperience。我使用了@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
据我了解,它将创建两个表。一个用于父类,有两列 employeeIdname。另一个包含四列的子类表。那是name,employeeid,salaryexperience
当我尝试使用所有四个值来持久化子对象(永久雇员)时,它正在插入子表中。 仅在子表中。它没有插入到父表中。
[1] 这是默认行为吗?还是我错过了什么?我需要像@OneToOne 映射这样的实体关系吗?
[旁注] 我也试过@Inheritance(strategy = InheritanceType.JOINED)。这次使用每个子类的表,它为它们创建两个表和外键关系。并将其插入两个表中。

【问题讨论】:

    标签: java hibernate inheritance


    【解决方案1】:

    是的,如果您使用@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS),实体将被持久化到一个表中,该表表示持久化实体的类。这可能对性能有好处,因为您不必在获取实体实例时进行表连接。但它也有一个缺点,例如表没有规范化,层次结构中父的修改会导致所有子表的变化。在大多数情况下,不推荐这种策略,尽管它是最简单的一种。

    至于OneToOne,如果你的意思是,你必须提供父类和它的子类之间的关系,那么没有。它用于在两个或多个实例之间建立关系,而不是用于类层次结构。

    【讨论】:

    • 那么我应该怎么做,如果我需要为这个“每个班级的表”将数据同时保存在父级和子级中。有什么解决办法吗?
    • 您必须使用不同的策略,然后 jpa 将为您创建带有连接选择的规范化表。如果你只使用hibernate,你会发现没有区别,但是如果你有一些带有选择的本机代码,你必须重新进行查询以使用连接
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2011-11-26
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多