質問

「ユーザー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にする必要があります。ユーザーがユーザーのフォロワーをロードしたい場合にのみ、それらをフェッチしたいと思います。

UserFriendsから分離して、User_IDを基本的にFriends_IDsへの参照であるすべてのUser_IDにマップする少なくとも2つの列を持つテーブルを作成してみてください。

また、EAGERは、最初に呼び出すとすぐにすべてのデータを読み込みます。すべてのユーザーとその友達をロードすることを意味します。友達の読み込みは、LAZYである必要があります。つまり、必要なときにのみ読み込まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top