将多个类映射到休眠状态中的表,不带 DTYPE 列

2022-09-03 02:47:11

我有两个休眠类:一个基类和一个具有附加字段的扩展类。(这些字段由其他表映射。

例如,我有:

@Entity
@Table(name="Book")
public class A {
    private String ID;
    private String Name;
    // ...
}

@Entity
@Table(name="Book")
public class B extends A {
    public String node_ID;
    // ...
}

public class Node {
    public String ID; // maps to B.node_ID
    // ...
}

如何在Hibernate中映射它?休眠文档声明了三种类型的继承配置:每个类一个表、一个具有类型列的表和一个联接表 - 这些都不适用于此处。

我需要这样做的原因是,类A来自通用框架,该框架在多个项目上重复使用,而类B(和Node)是特定于一个项目的扩展 - 它们不会再次使用。将来,我可能会有一个带有house_ID或其他领域的C类。

编辑:如果我尝试上述伪代码配置(映射到同一表的两个实体),我会收到一个错误,指出DTYPE列不存在。HQL 附加了一个“WHERE DTYPE=”A”。


答案 1

这是通过将 和 映射到两个类的相同值来实现的;这可以来自您使用的任何具有相同数据的列,无论哪种类型如何(不确定它是否适用于空值)。@DiscriminatorColumn@DiscriminatorValue

这些类应如下所示:

@Entity
@Table(name="Book")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="published")
@DiscriminatorValue(value="true")
public class A {
    private String ID;
    private String Name;
    // ...
}

@Entity
@Table(name="Book")
@DiscriminatorValue(value="true")
public class B extends A {
    public String node_ID;
    // ...
}

答案 2

推荐