2009-05-27 51 views
7

我有一个对象的字段可以是多个对象类型。这个对象被编码在一个单独的表中,该字段的子类型带有一个鉴别器列。每个这些子类型都将其字段映射到父对象表中的列。我似乎无法在休眠模型中进行建模。无论表中有哪些子类型数据,下面的代码将返回空值getSubfield()Hibernate嵌入式继承

架构

 
    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; 
} 

“的选择P从父P”

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

是否possib或者是否需要获得更多的创造性(这是一个传统数据库,更改架构并不是首选)

+1

一位同事在工作中指向我http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910。我想这是不支持= \ – 2009-05-28 16:59:48

回答

3

好吧,您不能轻易更改架构,但如何添加几个视图?

+1

好主意,不幸的是,它仍然是数据库结构的修改。我试图用代码解决这个问题,如果没有其他的东西,它似乎是冬眠可以做的事情,我很好奇我做错了什么。 – 2009-05-27 21:41:14

+1

+1对您的评论和提醒SO有时候,我们不能“做正确”并修复不良的模式设计。 :-) – cbmeeks 2013-04-18 20:07:08

1

我知道这是旧的。

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