簡體   English   中英

Hibernate @OneToMany關系映射

[英]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;

}

我遇到兩個問題:

  • Hibernate給我無法同時獲取多個包的問題
  • 我在網上查詢,有人說要刪除FetchType.EAGER或將其更改為Set而不是List,但這導致我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; 

首先,要實現您的功能,應使用@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,因為事實上,根據數據庫的設置方式,所有這些急切的加載可能會非常昂貴。 只有當用戶想要加載用戶關注者時,我才想獲取他們。

將“ UserFriends分開嘗試制作一個至少包含兩列的表,該User_IDUser_ID映射到他的所有Friends_IDs ,這基本上是對User_ID的引用

EAGER也會在您第一次調用它時立即加載所有數據。 意味着它將加載所有用戶及其朋友。 加載好友應為LAZY ,即僅在需要時加載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM