我想設計某種用戶到用戶的關係,比如「用戶A關注用戶B」和「用戶A想成爲用戶B的朋友」。休眠@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;
}
我遇到了兩個問題:
- Hibernate是爲了給我不能同時讀取多個袋問題
- 我在網上查過,人們說要刪除FetchType.EAGER或將其改爲Set而不是List,但那導致我Field doe sn't有一個默認值
我有關係沒有正確定義的感覺,我也應該看到更多的表,因爲現在,我只看到用戶表,並且User_User表。
更新
下面創建3桌,朋友,追隨者,和請求者。與5個表相比,這是否有所優化?與Jmes先生的建議相比,這有什麼優勢嗎?
@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:insert into User_User(requests_id,friendrequests_id)values(?,?) 2012-01-12 00:52:04,900 WARN [SqlExceptionHelper] SQL錯誤:1364,SQLState:HY000 2012-01-12 00:52 :04,901錯誤[SqlExceptionHelper]字段'following_id'沒有默認值' 這是我得到的問題。我認爲user_user表有5列,這是沒有必要的。而當我只需要更新請求或跟隨時,另一個沒有設置,這引發了這個問題。 – HeavenAgain 2012-01-12 05:55:15
@ user1129335如果你的關係真的是雙向的,就像我提到的那樣,你沒有選擇。爲了解決你的問題,我用'@ JoinTable'註解更新了我的答案。這個註釋將幫助你爲你的關係創建5個不同的表格。 – 2012-01-12 06:31:54
有兩件事我想問,你提到的'cascadeType.ALL'的效果聽起來像是一種期望的效果,因爲如果用戶刪除了他的賬戶,那麼我們並不真的想要一個鬼用戶?但那不是重點。我遇到了這個[post](http://stackoverflow.com/questions/1656113/hibernate-many-to-many-association-with-the-same-entity),好像我需要friendOf的另一個集合。問題是否真的有必要建立雙向關係? (而不是像你一樣創建5個表,這可以簡化爲三個表?使用joinColumn) – HeavenAgain 2012-01-12 06:42:16