如何建立朋友关系?为什么hibernate为ManyToMany关系创建一个新表

时间:2015-04-18 06:58:26

标签: mysql hibernate hibernate-mapping

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

我不确定这是否是一种正确的方法,以及为什么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;
   ..

}

1 个答案:

答案 0 :(得分:1)

你告诉Hibernate它是一个ManyToMany协会。

因此,用户必须能够拥有多个朋友(这会排除用户表中的外键),并且朋友必须能够拥有多个用户(这会排除朋友表中的外键) 。因此,唯一的方法是为关联建立一个连接表。

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

public class User {
    // ...

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

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

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

相关问题