2011-08-15 10 views
5

誰かが私が望むことをするために休止状態を構成する方法を理解する助けになることができますか?Hibernate - 親だけを持続させ、子供をそのまま保つ方法

私は子供のように "部屋"のリストを持つ親エンティティ "Appartment"を持っています。 私は "Appartment"を編集するためのフォームを持っています。そのフォームの中には、ちょうど参考になるようにすべての子ルーム "Room"がリストされています。部屋は別の形式で追加および編集されます。

だから、私はfalseに遅延読み込みを設定しているアパート形式の客室をリストアップしていますので:

@OneToMany 
@JoinColumn (name = "appartmentId") 
@LazyCollection (LazyCollectionOption.FALSE) 
private List<Room> room; 

しかし、私はそれをアパートを編集して保存する場合は、すべてのアパートの部屋に突然dissappear。データベースでは削除されませんが、参照解除されます(appartmentId = nullなど)。

私はどのように私のAppartmentオブジェクトを保持するためだけに休止状態を構成できますか?子供たちには全く触らないでください。 (あなたがWebページの場合のページのモデルにそれらを呼び出すことができます)の代わりに永続エンティティを使用しての

public String save() throws Exception { 
    boolean isNew = (appartment.getAppartmentId() == null); 

    appartment = appartmentManager.save(appartment); 

    String key = (isNew) ? "appartment.added" : "appartment.updated"; 
    saveMessage(getText(key)); 

    return SUCCESS; 
} 
+0

'Appartment'オブジェクトを保存する前に再構成していますか?明示的に、または新しい空のリストを作成することによって、あなたのリストから 'Room'を削除しているようです。 – Jeremy

+0

私は上記のsave-metodeを追加しました。あなたが見ることができるように、私は実際にそれを格納する前にappartmentオブジェクトに何もしません。 – user829237

+0

'appartment'はどこから来たのですか? – Jeremy

答えて

3

これは本当に簡単です。あなたの子供を再成長させたり、別々のDTOを作る必要はありません。

子を永続化させない場合は、単にinsertable = false、updatable = falseをjoincolumnアノテーションに追加します。このように:

@OneToMany 
@JoinColumn (name = "appartmentId", insertable = false, updatable = false) 
@Fetch(value = FetchMode.JOIN) 
private List<Room> room; 
+0

ありがとう!ちょうど私が欲しいもの。簡単で、清潔で、まっすぐにポイント! – user829237

+0

@ user829237:これは、部屋のリストに部屋を追加するだけで、アパートに部屋を追加することはできません。 –

+0

ええ、私は知っていますが、今のところそれは... – user829237

-2

、のDTOを使用することを検討してください:

これは私の保存・アクションです。彼らは、あなたが望む情報を表現し、あなたが望む形式でそれを示すための柔軟性を与えることができます。しかし、あなたはこれを支払うべきです - システムに新しいクラスを追加していて、エンティティをDTOに変換し戻す方法を考えなければなりません。

+0

1つあれば2つのマッピングレイヤーを持つ理由はありません。 – Jeremy

+0

私はマッピングレイヤについて何も言わなかった。 DTO/VOは目的に応じてデータを便利に描写するためのレイヤーです。通常は、永続的なエンティティを持つだけでは十分ではありません。特定の目的のために情報を具体的に運ぶクラスが必要です。 –

+0

十分に公正ですが、それは本当に質問に関係しません。 – Jeremy

1
  1. マッピングでレイジーフェッチを無効にしないでください。パフォーマンス調整にはfetching strategiesを使用してください。
  2. Hibernateは、部屋がないアパートメントを保存/更新するように指示した場合にのみ、その部屋をアパートメントから削除します。
+0

ありがとう! 1.フェッチ戦略を実装しただけでうまくいきます。 2. save-actionが呼び出されると、すべての部屋はappartment-objectから削除されます。部屋のリストを再投入するためにDBへの別の呼び出しを行うだけで不必要なように思えるので、appartmentを永続させるときに触れることはありません。これは本当にどのようになっているのでしょうか? – user829237

+0

新しいインスタンスを作成し、プライマリキーのプロパティを手動で設定して保存しようとしているとします。それは多くの異なる方法で失敗することになっています。エンティティを更新する正しい方法は、最初にエンティティをロードしてから、トランザクション内でエンティティを変更することです。 –

+0

作成しようとしているポイントは次のとおりです。appartment-objectを更新したいだけです。これは1つのdb-statement(更新appartment set ....など)と同じです。すべての子をロードする必要はありません。子供が手の届かない状態で親を保存できるようにするだけです。 – user829237

関連する問題