java - Hibernate 可选继承

标签 java hibernate inheritance

我有一个关于 Hibernate 注解和继承的问题。

在数据库中,我有一个 parent表和一个child table 。 parent表中的列未在 child 中复制表(Hibernate 中的 joined 关系)。对于 child 中的每一行表中,parent 中有一行 table 。在本例中,child 中的行表和 parent 中的相应行表有相同的 id值(value)。然而,parent表中的行在 child 中没有对应的行表。

混凝土child实体通过在 child 之间进行连接来表示和 parent ,和混凝土parent简单地由表 parent 表示.

表示这一点的面向对象方法是具有以下内容:

parent类:

@Entity
@Table(name = "Parent")
@Inheritance(strategy = InheritanceType.JOINED)
public class Parent{
    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;
    // More properties
}

child类:

@Entity
@Table(name = "Child")
@PrimaryKeyJoinColumn(name="id")
public class Child extends Parent{
    // More properties
}

当我使用 List child = session.createQuery("FROM Child").list(); 列出所有 child 时一切顺利。但是,我的问题是,当我尝试使用 List parent = session.createQuery("FROM Parent").list(); 列出 parent 时,它返回 child 的列表对象。

有没有办法在 Hibernate 中表示“可选”继承?

最佳答案

当您直接从 JPA 继承结构中查找父实体时,“最底层”子实体由 JPA 实现确定,因为这些子实体需要保留在持久区域中。因此,您提到的“可选继承”在 JPA 中是不可能的。 请看Hibernate Inheritance Strategy and Why的回答

在您的情况下,始终应用 LEFT OUTER JOIN。你可以做什么:

  1. 由于继承,您可以将结果转换为父实体。您将得到预期的结果,但由于不必要的连接而导致性能开销。

  2. 另一个选择是不使用继承。相反,您可以使用单向一对一关系,其中具有到的外键id。在此模型中,您可以处理及其(通过使用CascadeType.ALL),也可以在没有连接的情况下单独查询。一个例子:http://www.java2s.com/Tutorial/Java/0355__JPA/OneToOneUnidirectional.htm

关于java - Hibernate 可选继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37664479/

相关文章:

java - 框架布局在底部导航栏后面?

java - 一对多关系支持读取和删除,但不支持插入

java - Hibernate @Filter注解的使用

python - tkinter 单选按钮不显示类中的值

c++ - 继承与类型转换

java - Android ListView选定状态和setBackground

java - toString() 方法问题

java - 正则表达式查找字符串中的数字

java - Spring Data JPA、Hibernate 和 EXASOL 数据库

c++ - 当有多个派生类时,如何使用基类指针访问派生类的函数成员?