我有一个问题,我觉得应该很常见,但我找不到答案。
我有两个对象:组和用户。我的课程看起来像这样:
class Group
{
@ManyToMany(fetch = FetchType.EAGER)
List<User> users;
}
class User
{
@ManyToMany(fetch = FetchType.EAGER)
List<Group> groups;
}
现在,当我尝试从数据库中获取用户时,它会带来所有组,所有组都会带来所有用户等等。最后,我得到了一个stackoverflow异常。
如何解决此问题并仍然具有双向关联以及到达列表中对象的能力?
答案 0 :(得分:8)
如果您使用mappedBy
属性(无论如何应该使用)使双向关联的一方成为关联的拥有方面,您是否会遇到同样的问题?像这样:
@Entity public class Group {
...
@ManyToMany(fetch = FetchType.EAGER, mappedBy="groups")
List<User> users;
}
@Entity public class User {
...
@ManyToMany(fetch = FetchType.EAGER)
List<Group> groups;
}
更新:我找不到任何证据表明禁止在双向关联的两侧使用EAGER
获取和AFAIK,在Hibernate中没有提到这样的限制文档和/或JPA规范。
实际上,根据Emmanuel Bernard的this comment到(某种程度上类似的)问题:
LAZY
或EAGER
应与代码库中的无限循环问题正交。 Hibernate知道如何处理循环图
对我来说,上面的内容很清楚,Hibernate应该能够处理你的映射(就像我在评论中提到的那样),我很想把任何矛盾的行为看作是一个bug。
如果您可以提供允许重现问题的测试用例,我的建议是打开一个问题。
答案 1 :(得分:0)
当Hibernate试图急切地获取它需要的所有内容时,它可以正常工作。建模对象必须考虑休眠,因此不会发生循环和stackoverflow异常。
我所做的是删除关系的一方。您可以决定是要删除该侧还是将其保留并将另一侧定义为所有者。你还需要从那一侧删除热切的提取。
如果hibernate可以提供一种机制来定义多对多关系中的提取深度,那将是很好的。
答案 2 :(得分:0)
您可能希望将属性“hibernate.max_fetch_depth”设置为类似于3的内容,以限制急切的提取。