在没有DTYPE列的情况下将多个类映射到Hibernate中的表

时间:2011-02-01 21:26:06

标签: java hibernate

我有两个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“附加。

1 个答案:

答案 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;
    // ...
}