休眠@OneToMany关系映射
-
27-10-2019 - |
题
我想设计一些类型的用户以用户关系,如"用户一下用户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,这是由于以下事实:根据数据库的设置方式,所有这些急切的加载可能会非常昂贵。仅当用户想要加载用户关注者时,我才想获取他们。
单独的 User
从 Friends
尝试做一个表2列地图的 User_ID
他所有的 Friends_IDs
这基本上是一个参照 User_ID
还 EAGER
将加载 所有 数据尽快你叫它的第一次。意味着它将载的所有用户和他们的朋友。装载的朋友应该是 LAZY
, 即只装载的,当你需要他们。