4

これは一般的なシナリオだと思います。Hibernateに1対多のマッピングがあるとしましょうCategoryItems


カテゴリー:

@OneToMany(
    cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
@JoinColumn(name="category_id")
@Cascade(
    value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN
)
private List<Item> items;

アイテム:

@ManyToOne(targetEntity=Category.class,fetch=FetchType.EAGER)
@JoinColumn(name="category_id",insertable=false,updatable=false)
private Category category;

すべて正常に動作します。私はのライフサイクルCategoryを完全に制御するために使用します。Itemしかし、更新するコードを書いているときはCategory、まずCategoryDBから抜け出します。次に、それをUIに渡します。ユーザーは、変更された値を入力しCategoryて返します。ここで問題が発生します。Category情報を渡すだけで、ではないためItemsItemsコレクションは空になります。を呼び出すとsaveOrUpdate、すべての関連付けが消去されます。

これに対処するための最善の方法について何か提案はありますか?Category制御することの利点はItems、順序を簡単に維持できることItemsと、双方向で混乱しないことだと思います。

Categoryしかし、自分自身を更新したい状況はどうですか?最初にロードしてマージしますか?

4

1 に答える 1

1

あなたの問題については、コードに入らずに高レベルから見ると、問題は休止状態の構成ではなく、エンティティの処理方法にあることがわかります。以下の方法でエンティティの処理方法を変更することをお勧めします。

1)UIに渡す前に、Categoryオブジェクトをフェッチする方法について言及していません。したがって、get loadメソッドを使用してカテゴリオブジェクトを単純にフェッチする場合は、getterメソッドを呼び出すだけでアイテムコレクションをロードできる個別の初期化メソッドを作成できます。getterメソッドを使用すると、遅延ロードされたアイテムのコレクションにデータが入力され、UIに渡すことができます。ユーザーはカテゴリを変更するだけなので、アイテムはそのまま残ります。その後、そのエンティティを保存できるため、アイテムはそのまま残ります。

2)UIに渡す前にアイテムコレクションをロードしたくない場合は、アイテムコレクションをロードせずにカテゴリオブジェクトをフェッチできます。UIに渡します。ユーザーが変更して元に戻すと、直接保存するのではなく、最初にそのcategory_idの最新のカテゴリオブジェクトをフェッチし、getterを呼び出してアイテムをロードしてから、UIで返されたカテゴリから変更された値をこの最新のフェッチされたカテゴリに入力することをお勧めします。これで、このマージされたオブジェクトを保存できるため、アイテムの収集が安全になります。

于 2012-10-22T11:47:42.107 に答える