ここで概説するように、hibernateのクラスごとのテーブル階層を採用しました。
親にはいくつかの属性が含まれ、子にはさらに多くの属性が含まれる、単純な1層の階層があります。オブジェクトとの関係もあります。例えば:
@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に「更新」する戦略が見つかりません。