Как я могу обновить конкретный класс в рамках стратегии иерархии таблиц в классе Hibernate? - PullRequest
0 голосов
/ 24 января 2012

Я использовал иерархию таблиц для каждого класса в hibernate, как указано ниже здесь .

У меня есть простая одноуровневая иерархия, где родительский элемент включает в себя несколько атрибутов иребенок (дети) включают больше того же самого.Есть также отношения к объекту.Например:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"name"}) })
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 1)
abstract class X {
...
Long id;
String name;
List<A> a;
...
}
class Y extends X {
...
String getType() { return "Y"; }
...
}
class Z extends X {
...
String getType() { return "Z"; }
...
}
class A {}

Мне нужно «обновить» постоянный экземпляр Y до экземпляра Z, сохраняющего целостность.Если я выпущу, удалите Y;создать Z, я получаю уникальные нарушения ограничений (из-за упорядочения удалений в hibernate для последующего создания / обновления), но не нашел стратегии для "обновления" Y до Z.

1 Ответ

2 голосов
/ 24 января 2012

AFAIK, нет способа сделать это без полного обхода сеанса, поскольку это будет означать, что объект Java меняет свой конкретный тип, что невозможно.И даже тогда, если параллельная транзакция обновляет одну и ту же сущность в одно и то же время, вам лучше иметь оптимистичный параллелизм.И если другая транзакция обновляет сущность или загружает ее лениво, а тип изменился, у вас будут проблемы.

Короче говоря, если вам нужно это сделать, это, вероятно, означает, что у вас не должно быть наследства в первую очередь.Попробуйте сопоставить таблицу как единую сущность со столбцом типа и необязательными полями.

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