「ユーザーAはユーザーBに従う」、「ユーザーAはユーザーBの友達になりたい」など、ユーザーとユーザーとの関係を設計しようとしています。Hibernate @OneToMany関係マッピング
私は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 doe sn'tデフォルト値
私は関係が適切に定義されていないという感じを持っているを持っている、そして今、私は唯一のユーザーテーブル、およびUser_Userテーブルを参照してくださいので、また、私は、複数のテーブルを見てする必要があります。
更新
以下は3台、友人、フォロワー、およびリクエスタを作成します。これは5テーブルに比べて幾分最適化されていますか?そして、Mr.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;
'Hibernate:値(?、?)にの値を挿入User_User(requesting_id、friendrequests_id)2012-01-12 00:52:04,900 WARN [SqlExceptionHelper] SQLエラー:1364、SQLState:HY000 2012-01-12 00:52 :04,901 ERROR [SqlExceptionHelper]フィールド 'following_id'にデフォルト値がありません。 ' これは問題です。私は、user_userテーブルが必要ではない5列を持っていると思います。そして、私は、どちらかの要求を更新する必要があるだけで、もう1つは設定されていないため、この問題が発生します。 – HeavenAgain
@ user1129335私が言及したようにあなたの関係が本当に双方向であるなら、あなたは選択肢がありません。あなたの問題を解決するために、私は '@ JoinTable'アノテーションを使って答えを更新しました。この注釈は、あなたの関係に5つの異なる表を作成するのに役立ちます。 –
「cascadeType.ALL」の効果は、ユーザが自分のアカウントを削除した場合、実際にゴーストユーザを望んでいないため、希望の効果のように聞こえるという2つのことがあります。しかし、それはポイントのほかにあります。私はこの[post](http://stackoverflow.com/questions/1656113/hibernate-many-to-many-ass-ation-with-the-same-entity)に遭遇しました。friendOfの別のコレクションが必要なようです。質問、本当に双方向の関係が必要ですか? (また、5つのテーブルを作成するのではなく、これを3つのテーブルに簡略化することもできます(joinColumnを使用) – HeavenAgain