我需要建立友谊关系,每个用户可以拥有零到多个朋友。
我不确定这是否是一种正确的方法,以及为什么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;
..
}
答案 0 :(得分:1)
你告诉Hibernate它是一个ManyToMany协会。
因此,用户必须能够拥有多个朋友(这会排除用户表中的外键),并且朋友必须能够拥有多个用户(这会排除朋友表中的外键) 。因此,唯一的方法是为关联建立一个连接表。
如果您真正想要的是让用户能够成为多个朋友的请求者,并且还要成为多个朋友的接收者,那么您不需要多对多关联。你想要的是2个一对多的关联,这是你在朋友中已经拥有的多对一关联的反面:
public class User {
// ...
@OneToMany(mappedBy = "friendRequester")
private Set<Friend> requestedFriends;
@OneToMany(mappedBy = "friendReceiver")
private Set<Friend> receivedFriends;
}
顺便说一下,我会将朋友重命名为友谊,因为朋友的实例不是朋友,而是两个朋友之间的关联。