0

ここで概説するように、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に「更新」する戦略が見つかりません。

4

1 に答える 1

2

AFAIK、セッションを完全にバイパスせずにそれを行う方法はありません。これは、Javaオブジェクトがその具象型を変更することを意味するためです。これは不可能です。それでも、並行トランザクションが同じエンティティを同時に更新する場合は、楽観的同時実行性を使用することをお勧めします。また、別のトランザクションがエンティティを更新するか、遅延読み込みを行い、タイプが変更された場合、問題が発生します。

要するに、これを行う必要がある場合、それはおそらく、そもそも継承を持つべきではないことを意味します。タイプ列とオプションのフィールドを使用して、テーブルを単一のエンティティとしてマッピングすることを検討してください。

于 2012-01-24T18:32:33.273 に答える