2011-09-11 14 views
7

Spring/Hibernateベースのプロジェクトでは、2つのエンティティ間に1対多の関係があります。必要な操作は次のとおりです。双方向アソシエーションを休止する必要がありますか?

  • 子の親を見つけます。
  • 親の子供を見つける。
  • 親が削除されるときには、子も削除する必要があります。
  • 子を大量に作成します。

これを実装する方法は2つあります。

  1. Bidirectional association:子エンティティが親にリンク@ManyToOne列があり、そして親が子供@OneToManyレイジーロードされたコレクションを持っています。上記のすべての操作は、モデルで実行することができます。

    child.getParent(); 
    parent.getChildren(); //lazy loading 
    session.delete(parent); //cascade removal of the children does the trick here 
    session.save(parent); //cascade persist created the children 
    
  2. 単方向協会:子エンティティは、親が子供へのリンクを持っていない親にリンク@ManyToOne列を持っていますが、。ほとんどの操作は、サービス・メソッドで実行する必要があります。

    child.getParent(); //still in the model 
    Collection<Child> findChildren(Parent parent); //service method in ChildService 
    void deleteChildren(Parent parent); //service method in ChildService 
    void createChild(Parent parent, ... childAttributes); //service method in ChildService invoked for each new child. 
    

最初のアプローチは、実装するのが容易であると思われる(あなたはHibernateのカスケード機能を再利用することができます)が、私たちの一部は、問題の潜在的な原因として、双方向関連を参照してください。

より良いデザインの選択肢は何ですか?双方向アプローチによって作成された、よく知られた問題、パフォーマンス、またはデザインはありますか?

+0

lazyloadingを動作させる方法について説明している情報はありますか? JSFプロジェクトでこれに問題がありました。 –

+1

「私たちの中には、双方向協会が問題の潜在的な原因として認識されています」 - これらの潜在的な問題に名前を付けることができますか? –

答えて

3

Hibernateによってシーンの背後で実行されたクエリと同じことが子どもに遅延ロードされる場合、私はOneToManyの関連付けを単純に使用しないことで何が得られるのか分かりません。

あなたが行っていることを知っていて、エンティティの各メソッドがデータベースへのクエリに関してどのような意味を持っているのかを知っていれば、マップされたコレクションに問題はないはずです。トラバースすることが賢明な場合もあります。また、データベースへのラウンドトリップが多すぎないようにアドホッククエリを使用する方がよい場合もあります。キーは何が起こるかを理解することです。

アソシエーションを持つことは、必ずしも関連付けられたゲッターを呼び出す必要はなく、HQLクエリーでそれをナビゲートできるだけで非常に役立ちます。

0

遅延読み込みが本当にうまくいく状況であれば、私は双方向関係に本当の問題は見ていません。私はかつてHibernateが使われていたFlexアプリケーションを扱っていました。データがクライアントにシリアライズされたときに、双方向の関係によってデータベース全体がダウンロードされることがよくありました。

@JB Nizetによって答えは、それはほぼすべて、ちょうど1人のより多くの事言う

0

YMMV:あなたが投稿メソッド呼び出しのサンプルを見るには、双方向の方法は、おそらくあなたのビジネスロジックコードは多少読みやすくなります。

-1

はい、 可能な限り避けてください。あなたが本当に思うなら、それはあなたの要件です、そして、双方向性だけを使用してください。例えば。 EmpとDept、すべてのempには1つの部門がありますが、部門には多くの従業員がいます。 empは自分の部門について知っていなければなりませんが、部門が部門を知っていなければならないということは必須ではありません。

+1

これは答えよりもむしろコメントのようです。 – mattias

関連する問題