Spring/Hibernateベースのプロジェクトでは、2つのエンティティ間に1対多の関係があります。必要な操作は次のとおりです。双方向アソシエーションを休止する必要がありますか?
- 子の親を見つけます。
- 親の子供を見つける。
- 親が削除されるときには、子も削除する必要があります。
- 子を大量に作成します。
これを実装する方法は2つあります。
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
単方向協会:子エンティティは、親が子供へのリンクを持っていない親にリンク
@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のカスケード機能を再利用することができます)が、私たちの一部は、問題の潜在的な原因として、双方向関連を参照してください。
より良いデザインの選択肢は何ですか?双方向アプローチによって作成された、よく知られた問題、パフォーマンス、またはデザインはありますか?
lazyloadingを動作させる方法について説明している情報はありますか? JSFプロジェクトでこれに問題がありました。 –
「私たちの中には、双方向協会が問題の潜在的な原因として認識されています」 - これらの潜在的な問題に名前を付けることができますか? –