【问题标题】:how to make a friend relationship?Why does hibernate create a new table for ManyToMany relationship如何建立朋友关系?为什么hibernate会为ManyToMany关系创建一个新表
【发布时间】:2015-06-25 04:20:32
【问题描述】:

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

我不确定这是否是正确的方法以及为什么 hibernate 创建第三个表,我想外键足以建立关系。

我怎样才能摆脱第三张桌子?在数据库中为User生成了一张表,另外一张是Friend表,最后一张叫做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;
   ..

}

【问题讨论】:

    标签: mysql hibernate hibernate-mapping


    【解决方案1】:

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

    所以一个用户必须能够有几个朋友(这排除了用户表中的外键),并且一个朋友必须能够有很多用户(这排除了朋友表中的外键) .因此,唯一的方法是为关联创建一个连接表。

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

    public class User {
        // ...
    
        @OneToMany(mappedBy = "friendRequester")
        private Set<Friend> requestedFriends;
    
        @OneToMany(mappedBy = "friendReceiver")
        private Set<Friend> receivedFriends;
    }
    

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

    【讨论】:

    • 谢谢,我做到了,但同样的问题仍然存在。将创建一个名为 User_Friend 的表并接受 user_id 3、请求者 1 和接收者 2
    • 不,不会的。除非您忘记了 mappedBy 属性。或者除非您在代码中保留多对多关联。
    猜你喜欢
    • 2020-11-27
    • 2020-08-07
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2019-05-23
    • 2013-08-21
    相关资源
    最近更新 更多