Изменить подтип в Hibernate Inheritance - PullRequest
2 голосов
/ 08 марта 2012

У меня есть три класса, которые я хочу моделировать, используя Hibernate в Play! Framework:

@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!Я уже определил идентификатор идентификатора первичного ключа.

В большинстве случаев он работает нормально: у меня есть три таблицы базы данных, идентификаторы 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 Ответ

1 голос
/ 08 марта 2012

Если подстанции могут переключаться с высокого напряжения на среднее (или обратно), я не буду моделировать их как отдельные подтипы.Вместо этого я бы просто использовал один тип SubStation со свойством, чтобы определить, высокое это или среднее напряжение.В Hibernate это будет отображаться в одной таблице со свойством дискриминатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...