Hibernate嵌入式继承

时间:2009-05-27 20:54:39

标签: java hibernate inheritance mapping

我有一个对象,其字段可以是多种对象类型。此对象在单个表中编码,并带有字段子类型的鉴别器列。这些子类型中的每一个都将其字段映射到父对象表中的列。我似乎无法在hibernate中对此进行建模。无论表中的子类型数据是什么,下面的代码都将为getSubfield()返回null。

模式

  id   type   whosit   whatsit  
+----+------+--------+---------+
| 1  | "A"  | "test" | null    |
| 2  | "B"  | null   | "test"  |
+----+------+--------+---------+

域对象

@Entity
public class Parent {
    protected @Id @GeneratedValue int id;
    protected Subfield subfield;

    public Subfield getSubfield() {return subfield;} 
}


@Embeddable
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING)
public abstract class Subfield {}


@DiscriminatorValue("A")
public class TypeA extends Subfield {
    public String whosit;
}


@DiscriminatorValue("B")
public class TypeB extends Subfield {
    public String whatsit;
}

“SELECT p FROM parent p”

{id=1,subfield=null}
{id=2,subfield=null}

是否有可能使用此对象模型完成我想要的任务,或者我是否需要更具创造性(这是一个遗留数据库,更改架构不是首选)

3 个答案:

答案 0 :(得分:5)

正如提问者所指出的,hibernate不支持可嵌入类的继承(https://hibernate.atlassian.net/browse/HHH-1910)。

根据Eclipse wiki,JPA没有指定这种行为,但EclipseLink确实支持它(http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance)。

我的建议是在Subfield中彻底粉碎班级。可怕,但应该工作直到这个问题解决了。

答案 1 :(得分:3)

好的,你不能轻易改变架构,但是如何添加几个视图呢?

答案 2 :(得分:1)

我知道这已经过时了。

解决这个问题的方法如上所述。创建一个视图。你说你不想改变架构。然后不要。您可以创建一个新架构,映射旧架构并执行您想要的操作。 (可能取决于数据库)