如何建立朋友关系?为什么hibernate会为多对多关系创建一个新的table

how to make a friend relationship?Why does hibernate create a new table for ManyToMany relationship

我需要有好友关系,每个用户可以有零到多个好友。

我不确定这样做是否正确以及为什么休眠要创建第三个 table,我想外键足以建立关系。

如何去掉第三个 table?在数据库中为用户生成一个table,另一个是朋友table,最后一个称为User_Friend,其中有User_id、friends_requester_id、friends_receiver_id 字段。

这里的主要问题是每个用户都可以在 user_friend 关系中而不是友谊的一部分。例如

User_id friends_requester_id friends_receiver_id
1            1                  2
2            1                  2
3            1                  2    <<<this one is incorrect, 
                                        user id 3 is not part of this friendship record

我的类如下,我需要知道是谁提出的请求以及关系开始的日期。

@Entity
public class User{
   @Id
   @GeneratedValue
   long id;
   @ManyToMany(cascade = CascadeType.ALL)
   List<Friend> friends;
   ..
}

@Entity
public class Friend implements Serializable {
   @Id
   @ManyToOne
   User friendRequester;
   @Id
   @ManyToOne
   User friendReceiver;
   @Temporal(javax.persistence.TemporalType.DATE)
   Date date;
   ..

}

你告诉 Hibernate 这是一个多对多关联。

所以一个用户必须能够有几个朋友(这排除了用户中的外键table),而一个朋友必须能够有很多用户(这排除了一个外键键入好友 table)。因此,唯一的方法是为协会加入 table。

如果你真正想要的是让用户能够成为多个朋友的请求者,同时也是多个朋友的接收者,那么你不需要多对多的关联。您想要的是 2 个一对多关联,它们是您在 Friend 中已有的多对一关联的反面:

public class User {
    // ...

    @OneToMany(mappedBy = "friendRequester")
    private Set<Friend> requestedFriends;

    @OneToMany(mappedBy = "friendReceiver")
    private Set<Friend> receivedFriends;
}

顺便说一下,我会把 Friend 重命名为 Friendship,因为 Friend 的实例不是朋友,而是两个朋友用户之间的关联。