Hibernate嵌入式继承

10

我有一个对象,其中一个字段可以是多个对象类型中的任意一种。该对象在一个包含子类型字段的鉴别器列的单个表中编码。每个子类型将其字段映射到父对象表中的一列。我似乎无法在 Hibernate 中对此建模。无论表中是什么子类型数据,下面的代码都将返回 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}

使用这个对象模型可以实现我想要的吗,还是需要更有创意一些(这是一个遗留数据库,不希望更改架构)?


1
一位同事在工作中向我指出了http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910。我猜它不受支持 =\ - Steve Skrla
3个回答

7

3

好的,虽然您不能轻松更改架构,但是您可以添加一些视图如何?


2
好主意,不幸的是,这仍然是对数据库结构的修改。我正在尝试用代码解决这个问题,如果没有其他办法,似乎这是Hibernate可以做到的,我很想知道我做错了什么。 - Steve Skrla
2
给你的评论点个赞,提醒 Stack Overflow 有时候我们不能"让它变得正确"并修复糟糕的模式设计。 :-) - cbmeeks

1
我知道这是老旧的内容。
解决方法之一如上所述。创建一个视图。你说你不想改变模式。那就不要改变。你可以创建一个新的模式,将旧的模式映射并实现你想要的功能。(可能取决于数据库)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接