我正在尝试设计某种用户与用户的关系,例如“用户 A 关注用户 B”和“用户 A 想成为用户 B 的朋友”。
我有一个 User 类,它的设计方式如下所示:
@Entity
public class User{
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> followers;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> following;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> friendRequests;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> requesting;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
List<User> friends;
}
我遇到了两个问题:
- Hibernate 给了我不能同时获取多个包的问题
- 我在网上查了一下,有人说要删除 FetchType.EAGER 或将其更改为 Set 而不是 List,但这导致我的 Field 没有默认值
我感觉关系没有正确定义,而且我应该看到更多的表,因为现在我只看到 User 表和 User_User 表。
更新
下面创建 3 个表、朋友、关注者和请求者。与 5 个表相比,这是否有所优化?与 J4mes 先生的建议相比,这有什么优势吗?
@ManyToMany
@JoinTable(name = "followers", joinColumns = @JoinColumn(name = "followerId"), inverseJoinColumns = @JoinColumn(name = "userId"))
private List<User> followers;
@ManyToMany
@JoinTable(name = "followers", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "followerId"))
private List<User> following;
@ManyToMany
@JoinTable(name = "friends", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "friendId"))
private List<User> friends;
@ManyToMany
@JoinTable(name = "requesters", joinColumns = @JoinColumn(name = "requesterId"), inverseJoinColumns = @JoinColumn(name = "userId"))
private List<User> friendRequests;
@ManyToMany
@JoinTable(name = "requesters", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "requesterId"))
private List<User> requesting;