2011-01-14 7 views
1

タイトルにはかなりの質問があります。Hibernateと双方向の関係しか持たないのですか?

私はいくつかのクラスを持っているとしましょう:ユーザー、投稿、コメント、タグ。

  • ユーザーは@OneToManyリストと @OneToManyリストを持っています。
  • 投稿は @ManyToOne User、@OneToMany List、@ManyToMany List。
  • コメントは@ManyToOneリスト、 @ManyToOneユーザーです。
  • タグは@ManyToManyです。 リスト。

私はHibernateの新機能ですが、Tagオブジェクトの属性を使用して、そのタグに関連するすべてのPostオブジェクトを取得したり、Postオブジェクトの作成者特定のユーザーによって書かれた投稿。

いいですか?

私はここでパフォーマンスの面でもっと話しています。私はまた、プレイを使用しています!フレームワーク。これが何か変わるかどうかはわかりません。

答えて

2

私はそのうちのいくつかは一方向であるべきだと思います。

例えば、実際のシナリオでは、それらをフィルタリングまたはpaginatiedしなければならないので、あなたは通常、「Userにより、すべてのPost S」を表示する必要はありませんので、あなたの代わりにPost秒を取得するデータベースに対してクエリを実行する必要がありますUserから(これらのユースケースではデータベース側のコレクションをフィルタリングしないと、特にそのコレクションが巨大である場合は、実際のパフォーマンス上の問題になる可能性があるためです)。

UserPostのコレクションを持つことは意味がありません。 User - CommentTag - Postの関係についても同様です。

+0

どうすればいいですか?特定のタグでタグ付けされたすべての投稿を含むページが必要ですか? –

+0

@Marc: 'SELECT p FROM POST p WHERE:tag is p.tags'のようなクエリを実行します。 'setFirstResult' /' setMaxResults'を適用することを忘れないでください。なぜなら、データベースが大規模であれば、すべてのマッチした投稿を持つページを見たいからです。 – axtavt

+0

しかし、例えば 'aTagObject.getPosts()'のようにすればいいのですが。 'setFirstResult'と' setMaxResults'を設定することができないからです。 –

2

双方向の関係があれば問題ありません。本当の危険はまた、怠け者の嘘をつくことにあります。なぜなら、あなたはすべての要求に対してメモリにたくさんのdbをロードすることになるからです。

双方向の関係がある場合は、hqlを使用して、必要なデータのみをロードできる特定のDAOメソッドを作成することをお勧めします。

+0

あなたの答えをありがとう。あなたは怠け者であることを虚偽で説明できますか? –

+0

ああ、私はそれを得たと思う。 Lazyとは、データにアクセスしたいときだけデータベースからデータを取得することを意味します。そして、それがオフになると、Hibernateは必要なすべてのデータを取得します。したがって、双方向の関係では、あなたが言ったように多くのメモリをロードすることになります。それがオンになっていると仮定すると、それはOKですか? –

+0

あなたはそれを持っています。私の答えにsentencを追加しました。 – hvgotcodes

関連する問題