Hibernate嵌入式继承

Ste*_*rla 7 java mapping inheritance hibernate

我有一个对象,其字段可以是许多对象类型.此对象在单个表中编码,并带有字段子类型的鉴别器列.这些子类型中的每一个都将其字段映射到父对象表中的列.我似乎无法在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;
}
Run Code Online (Sandbox Code Playgroud)

"SELECT p FROM parent p"

{id=1,subfield=null}
{id=2,subfield=null}
Run Code Online (Sandbox Code Playgroud)

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

Thi*_*ves 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中彻底粉碎课程层次.可怕,但应该工作,直到这个解决.


Jam*_*s L 3

好吧,您无法轻松更改架构,但是添加几个视图怎么样?

  • 好主意,不幸的是,它仍然是对数据库结构的修改。我正在尝试用代码解决这个问题,如果没有别的办法,这似乎是休眠可以做的事情,我很好奇我做错了什么。 (2认同)
  • +1 对您的评论并提醒,有时,我们无法“使其正确”并修复不良的架构设计。:-) (2认同)