gpt4 book ai didi

mysql - 如何建立好友关系?hibernate为什么要为ManyToMany关系创建一个新表

转载 作者:行者123 更新时间:2023-11-29 12:16:32 25 4
gpt4 key购买 nike

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

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

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

@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 这是一个 ManyToMany 关联。

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

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

public class User {
// ...

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

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

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

关于mysql - 如何建立好友关系?hibernate为什么要为ManyToMany关系创建一个新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29714044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com