【问题标题】:Change subtype in Hibernate Inheritance在 Hibernate 继承中更改子类型
【发布时间】:2012-03-25 22:05:38
【问题描述】:

我想在 Play!Framework 中使用 Hibernate 建模三个类:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class SupplyArea extends Model {
    public int scadaId;
    public String symbol;
}

@Entity
public class HighVoltageSubstation extends SupplyArea {
    public int hvAttribute;
}

@Entity
public class MediumVoltageSubstation extends SupplyArea {
    public int mvAttribute;
}

感谢 Play!我已经定义了主键标识符 id。

它在大多数情况下都能正常工作:我有三个数据库表,HVSubstation 和 MVSubstation 标识符被创建为 SupplyArea 的外键等等。

但我并不“拥有”这些对象,我需要从其他来源导入它们。然后,如果另一个应用程序发生变化,我需要更新我的。问题是当对象改变它的类型时:它不再是一个 HVSubstation,它现在是一个 MVSubstation。所有其他参数(即 scadaId、符号)保持不变。它是同一个对象,但有另一种类型。

有什么方法可以在不丢失主键标识符的情况下在子类型之间切换?我试过这样的事情:

SupplyArea oldArea = SupplyArea.getByScadaId(scadaId); // returns HVSubstation
SupplyArea newArea = new MVSubstation();
newArea.id = oldArea.id;
newArea.scadaId = scadaId;
newArea.symbol = symbol;
oldArea.delete();
newArea.save();

显然,它不起作用。

【问题讨论】:

    标签: java hibernate inheritance playframework


    【解决方案1】:

    如果变电站可以从高压变为中压(或变回),我不会将它们建模为单独的子类型。相反,我只会使用具有属性的单个 SubStation 类型来确定它是高压还是中压。在 Hibernate 中,这将映射到具有鉴别器属性的单个表。

    【讨论】:

    • 恐怕这不是个好主意。除了我提到的这两个之外,还有更多的亚型。并且在它们之间切换类型并不是有人会一直做的——它宁愿是源应用程序中的“修复错字”问题。但对我来说,所有这些子类型都有完全不同的附加属性集。
    • @Umberto,好的,如果切换类型是例外而不是常态,我上面的解决方案不适用。我不认为你可以在 Hibernate 中做到这一点(即在重用主键的同时将数据从一个表迁移到另一个表)。您最好的选择可能是使用存储过程来完成这项肮脏的工作。然后,您必须注意使任何陈旧的缓存数据无效。
    • 可惜了。好吧,我们不能总是在代码的顶层工作,对吧? ;) 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2014-01-21
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多