2012-01-24 9 views
0

私は、hereのように、hibernateのクラスあたりのテーブル階層を採用しました。hibernateのtable-per-class-hierarchy戦略で具体的なクラスを更新するにはどうすればよいですか?

私は、親がいくつかの属性を含み、子(複数)が同じものをもっと含む単純な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 {} 

は、整合性を維持するZのインスタンスにYの永続化インスタンスを「更新」です。私が削除Yを発行した場合。 Zを作成すると、ユニークな制約違反が発生します(作成/更新をフォローするための休止の順序による)が、YをZに「更新」する戦略はありません。

+0

私は、階層の変更とサブタイプの列挙を使用して、具体的なクラスの違いを容易にしました。 –

答えて

2

AFAIK、セッションをバイパスせずに行う方法はありませんこれは、Javaオブジェクトが具体的な型を変更することを意味するため、完全には不可能です。さらに、同時トランザクションが同じエンティティを同時に更新する場合でも、オプティミスティックな同時実行性を持つ方がよいでしょう。また、別のトランザクションがエンティティをリフレッシュしたり遅延したりして型が変更された場合は、問題が発生します。

要するに、これを行う必要がある場合は、最初に継承を行うべきではないということです。テーブルを単一のエンティティとしてマッピングすることを検討してください。型の列とオプションのフィールドがあります。

関連する問題