我有一个关于 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。你可以做什么:
由于继承,您可以将结果转换为父实体。您将得到预期的结果,但由于不必要的连接而导致性能开销。
另一个选择是不使用继承。相反,您可以使用单向一对一关系,其中子具有到父的外键id。在此模型中,您可以处理子及其父(通过使用CascadeType.ALL),也可以在没有连接的情况下单独查询父。一个例子:http://www.java2s.com/Tutorial/Java/0355__JPA/OneToOneUnidirectional.htm
关于java - Hibernate 可选继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37664479/