在Hibernate继承中更改子类型

时间:2012-03-08 12:07:13

标签: java hibernate inheritance playframework

我想在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();

显然,它不起作用。

1 个答案:

答案 0 :(得分:1)

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