我有一个对象,其字段可以是多种对象类型。此对象在单个表中编码,并带有字段子类型的鉴别器列。这些子类型中的每一个都将其字段映射到父对象表中的列。我似乎无法在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}
是否有可能使用此对象模型完成我想要的任务,或者我是否需要更具创造性(这是一个遗留数据库,更改架构不是首选)
答案 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)
我知道这已经过时了。
解决这个问题的方法如上所述。创建一个视图。你说你不想改变架构。然后不要。您可以创建一个新架构,映射旧架构并执行您想要的操作。 (可能取决于数据库)