【问题标题】:Hibernate Embeddable InheritanceHibernate 可嵌入继承
【发布时间】:2010-10-29 09:54:35
【问题描述】:

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

架构

id 类型 whosit whatsit +----+------+--------+---------+ | 1 | “一个” | “测试” |空 | | 2 | "B" |空 | “测试” | +----+------+--------+---------+

领域对象

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

是否有可能用这个对象模型完成我想要的,或者我需要更多的创意(这是一个遗留数据库,不建议更改架构)

【问题讨论】:

标签: java hibernate inheritance mapping


【解决方案1】:

正如提问者所指出的,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 内完全粉碎类层次结构。太可怕了,但在解决这个问题之前应该可以工作。

【讨论】:

    【解决方案2】:

    好的,您不能轻易更改架构,但是添加几个视图怎么样?

    【讨论】:

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

    我知道这是旧的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2012-06-27
      • 2016-11-27
      相关资源
      最近更新 更多