我想设计一些类型的用户以用户关系,如"用户一下用户B"和"用户一想要用户B的朋友"。

我有一个用户类别的方式,以及它被设计看起来是这样的:

@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;

}

我遇到两个问题:

  • 休眠的是给我的 不能同时取多个袋 的问题
  • 我已经看了网上,人们所说的去除FetchType.渴望或改变它的组而不是清单,但是,导致我 现场没有默认值

我有一种感觉,这种关系不是定义的正确,而我也应该看到更多的表,因为现在,我只看到用户表,并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;
有帮助吗?

解决方案

首先,要实现您的功能,您应该使用@ManyToMany而不是@OneToMany。它应该看起来像这样: 通用标签

您的关系对我而言似乎是双向的。如果您使用@OneToMany,则意味着C has 2 followers A and B= A and B only follows C。但是,事实是一个人可以跟随许多人,而一个人可以被许多人跟随。换句话说,A and B can also follow D

此外,您根本不应该使用cascadeType.ALL。该级联策略意味着,如果一个用户删除了他的帐户,并且您删除了数据库中的相应条目,那么他的所有朋友等也将被删除。

其他提示

Hibernate只会为User实体生成一个表,而我假设是User-User关系的交叉引用表。解决具有不同表的方法可能是针对不同关系设置不同的实体,即

用户实体 通用标签

下一个实体 通用标签

对于EAGER抓取,您可能实际上希望所有这些都是LAZY,这是由于以下事实:根据数据库的设置方式,所有这些急切的加载可能会非常昂贵。仅当用户想要加载用户关注者时,我才想获取他们。

单独的 UserFriends 尝试做一个表2列地图的 User_ID 他所有的 Friends_IDs 这基本上是一个参照 User_ID

EAGER 将加载 所有 数据尽快你叫它的第一次。意味着它将载的所有用户和他们的朋友。装载的朋友应该是 LAZY, 即只装载的,当你需要他们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top