「ユーザーAがユーザーBをフォローしている」、「ユーザーAがユーザーBの友達になりたい」など、ユーザーとユーザーの関係を設計しようとしています。
Userクラスがあり、その設計方法は次のようになります。
@Entity
public class User{
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> followers;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> following;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> friendRequests;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> requesting;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> friends;
}
私は2つの問題に直面しています:
- Hibernateは、複数のバッグを同時にフェッチできないという問題を私に与えています
- オンラインで調べたところ、FetchType.EAGERを削除するか、ListではなくSetに変更すると言われましたが、Fieldにデフォルト値がありません。
関係が適切に定義されていないように感じます。また、現在、UserテーブルとUser_Userテーブルしか表示されていないため、さらに多くのテーブルが表示されるはずです。
アップデート
以下は、3つのテーブル、友達、フォロワー、およびリクエスターを作成します。これは5つのテーブルと比較していくらか最適化されていますか?そして、J4mes氏が提案したものと比較して、これに何か利点はありますか?
@ManyToMany
@JoinTable(name = "followers", joinColumns = @JoinColumn(name = "followerId"), inverseJoinColumns = @JoinColumn(name = "userId"))
private List<User> followers;
@ManyToMany
@JoinTable(name = "followers", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "followerId"))
private List<User> following;
@ManyToMany
@JoinTable(name = "friends", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "friendId"))
private List<User> friends;
@ManyToMany
@JoinTable(name = "requesters", joinColumns = @JoinColumn(name = "requesterId"), inverseJoinColumns = @JoinColumn(name = "userId"))
private List<User> friendRequests;
@ManyToMany
@JoinTable(name = "requesters", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "requesterId"))
private List<User> requesting;