我有两个hibernate类:一个基类,一个包含其他字段的扩展类。 (这些字段由其他表映射。)
例如,我有:
@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中映射? The hibernate documentation表示三种类型的继承配置:每个类一个表,一个带有类型列的表和一个连接表 - 这里没有一个适用。
我需要这样做的原因是因为A类来自于在多个项目中重用的通用框架,而B类(和Node)是特定于一个项目的扩展 - 它们将不再被使用。在将来,我可能有一个带有house_ID或其他字段的C类。
编辑:如果我尝试上面的伪代码配置(两个实体映射到同一个表),我会收到DTYPE列不存在的错误。 HQL有一个“其中DTYPE =”A“附加。
答案 0 :(得分:11)
这可以通过将@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;
// ...
}