![](/img/trans.png)
[英]Order and OrderLine Relationship mapping in Hibernate. Where to put @OnetoMany and/or @ManytoOne
[英]Hibernate @OneToMany relationship mapping
我正在嘗試設計某種用戶與用戶的關系,例如“用戶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;
}
我遇到兩個問題:
我感覺這種關系定義不正確,而且我應該看到更多的表,因為現在,我只看到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;
首先,要實現您的功能,應使用@ManyToMany
而不是@OneToMany
。 它看起來應該像這樣:
@Entity
public class User implements Serializable {
@ManyToMany(mappedBy="followers")
@JoinTable(name="followingTable")
private Set<User> following;
@ManyToMany
@JoinTable(name="followerTable")
private Set<User> followers;
@ManyToMany(mappedBy="friendRequests")
@JoinTable(name="requestingTable")
private Set<User> requesting;
@ManyToMany
@JoinTable(name="friendRequestTable")
private Set<User> friendRequests;
@ManyToMany
private Set<User> friends;
}
在我看來,您的關系就像是雙向關系。 如果使用@OneToMany
,則意味着C has 2 followers A and B
= A and B only follows C
但是,事實是一個人可以跟隨許多人,而一個人可以被許多人跟隨。 換句話說, A and B can also follow D
此外,您根本不應使用cascadeType.ALL
。 該級聯策略意味着,如果一個用戶刪除了他的帳戶,並且您刪除了數據庫中的相應條目,那么他的所有朋友等也將被刪除。
Hibernate只會為User實體生成一個表,而我假設是User與User關系的交叉引用表。 解決具有不同表的方法可能是針對不同關系設置不同的實體,即
用戶實體
@OneToMany
List<Follower> followers;
追隨者實體
@Entity
class Follower
...
@ManyToOne
User user;
@Id
@Generated
int id;
至於EAGER的獲取,實際上您可能希望所有這些都是LAZY,因為事實上,根據數據庫的設置方式,所有這些急切的加載可能會非常昂貴。 只有當用戶想要加載用戶關注者時,我才想獲取他們。
將“ User
與Friends
分開嘗試制作一個至少包含兩列的表,該User_ID
將User_ID
映射到他的所有Friends_IDs
,這基本上是對User_ID
的引用
EAGER
也會在您第一次調用它時立即加載所有數據。 意味着它將加載所有用戶及其朋友。 加載好友應為LAZY
,即僅在需要時加載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.