Hibernate @ OneToMany関係マッピング
-
27-10-2019 - |
質問
「ユーザーAがユーザーBをフォローしている」、「ユーザーAがユーザーBの友達になりたい」など、ユーザーとユーザーの関係を設計しようとしています。
Userクラスがあり、その設計方法は次のようになります。 ジェネラコディセタグプレ
2つの問題が発生しています:
- Hibernateが複数のバッグを同時にフェッチできない問題を引き起こしています
- オンラインで調べたところ、FetchType.EAGERを削除するか、リストではなくセットに変更すると言われましたが、その結果、フィールドにデフォルト値がありません
関係が適切に定義されていないように感じます。また、現在、UserテーブルとUser_Userテーブルしか表示されていないため、さらに多くのテーブルが表示されるはずです。
更新以下は、3つのテーブル、友達、フォロワー、リクエスターを作成します。これは5つのテーブルと比較していくらか最適化されていますか?そして、J4mes氏が提案したものと比較して、これに何か利点はありますか? ジェネラコディセタグプレ
解決
まず、機能を実装するには、@ManyToMany
の代わりに@OneToMany
を使用する必要があります。次のようになります:
ジェネラコディセタグプレ
あなたの関係は私には双方向の関係のように見えます。@OneToMany
を使用する場合、それは、C has 2 followers A and B
= A and B only follows C
を意味します。しかし、実際には、一人が多くの人をフォローすることができ、一人が多くの人をフォローすることができます。言い換えれば、A and B can also follow D
です。
その上、cascadeType.ALL
はまったく使用しないでください。このカスケードポリシーは、1人のユーザーが自分のアカウントを削除し、データベース内の対応するエントリを削除すると、そのユーザーのすべての友達なども削除されることを意味します。
他のヒント
Hibernateはユーザーエンティティに対して1つのテーブルのみを生成し、ユーザーとユーザーの関係の相互参照テーブルを想定しています。異なるテーブルを使用するための回避策は、異なる関係に対して異なるエンティティを設定することです。つまり、
ユーザーエンティティ ジェネラコディセタグプレ
フォロワーエンティティ ジェネラコディセタグプレ
EAGERフェッチに関しては、データベースの設定方法によっては、これらすべての熱心なロードが非常に高価になる可能性があるため、実際にはすべてをLAZYにする必要があります。ユーザーがユーザーのフォロワーをロードしたい場合にのみ、それらをフェッチしたいと思います。
User
をFriends
から分離して、User_ID
を基本的にFriends_IDs
への参照であるすべてのUser_ID
にマップする少なくとも2つの列を持つテーブルを作成してみてください。
また、EAGER
は、最初に呼び出すとすぐにすべてのデータを読み込みます。すべてのユーザーとその友達をロードすることを意味します。友達の読み込みは、LAZY
である必要があります。つまり、必要なときにのみ読み込まれます。