hibernate @ManyToMany双向渴望获取

时间:2010-10-20 14:08:23

标签: hibernate many-to-many fetch

我有一个问题,我觉得应该很常见,但我找不到答案。

我有两个对象:组和用户。我的课程看起来像这样:

class Group
{
  @ManyToMany(fetch = FetchType.EAGER)
  List<User> users;
}

class User
{
  @ManyToMany(fetch = FetchType.EAGER)
  List<Group> groups;
}

现在,当我尝试从数据库中获取用户时,它会带来所有组,所有组都会带来所有用户等等。最后,我得到了一个stackoverflow异常。

如何解决此问题并仍然具有双向关联以及到达列表中对象的能力?

3 个答案:

答案 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到(某种程度上类似的)问题:

  

LAZYEAGER应与代码库中的无限循环问题正交。 Hibernate知道如何处理循环图

对我来说,上面的内容很清楚,Hibernate应该能够处理你的映射(就像我在评论中提到的那样),我很想把任何矛盾的行为看作是一个bug。

如果您可以提供允许重现问题的测试用例,我的建议是打开一个问题。

答案 1 :(得分:0)

当Hibernate试图急切地获取它需要的所有内容时,它可以正常工作。建模对象必须考虑休眠,因此不会发生循环和stackoverflow异常。

我所做的是删除关系的一方。您可以决定是要删除该侧还是将其保留并将另一侧定义为所有者。你还需要从那一侧删除热切的提取。

如果hibernate可以提供一种机制来定义多对多关系中的提取深度,那将是很好的。

答案 2 :(得分:0)

您可能希望将属性“hibernate.max_fetch_depth”设置为类似于3的内容,以限制急切的提取。