我想在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();
显然,它不起作用。
答案 0 :(得分:1)
如果变电站可以从高电压变为中压(或返回电压),我不会将它们建模为单独的子类型。相反,我只会使用具有属性的单个SubStation类型来确定它是高电压还是中电压。在Hibernate中,这将映射到具有discriminator属性的单个表。