当前位置: 首页 > 面试题库 >

休眠@ManyToMany双向渴望获取

董联
2023-03-14
问题内容

我有一个我认为应该很普遍的问题,但找不到答案。

我有2个对象:组和用户。我的课程如下所示:

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

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

现在,当我尝试从数据库中获取用户时,它带来了所有组,所有组都带来了所有用户,依此类推。最后,我遇到了stackoverflow异常

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


问题答案:

如果使用属性(无论如何都应使用)将双向关联的一侧设为关联的 拥有 侧,是否会遇到相同的问题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禁止在双向关联的两面使用Fetch和AFAIK,在Hibernate文档和/或JPA规范中没有提及这种限制。

实际上,根据此评论从灵光伯纳德一个(在某种程度上类似)的问题:

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

对我来说,上面的内容很清楚,Hibernate应该能够处理您的映射(正如我在评论中提到的那样),我很容易将任何矛盾的行为都视为错误。

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



 类似资料:
  • 问题内容: 我有一个实体A,它具有-B实体,而B具有-A与@OneToOne双向关联。 现在,当我找到所有A记录时,hibernate使用B上的左外部联接执行两个查询,如下所示: 第一次查询会加载A和B字段,但可以,但是为什么要执行第二次查询来重新加载A?我认为此查询将B中的A内容加载,但此A显然是包含B的A …因此它已经加载了第一个查询,不是吗? -编辑- 实体A: 实体B: 就是这种情况,在A

  • 问题内容: 我有两个以下列方式注释的实体类 如果我存储类“ B”的实例,则关系将存储在数据库中,并且类“ A”中的吸气剂将返回B的正确子集。但是,如果我对“ A”中的B列表进行了更改,更改是否不存储在数据库中? 我的问题是,我该如何做到使任一类的更改都“级联”到另一类? 编辑:我尝试过删除mapedBy参数和定义JoinTable(和列)的不同变体,但我一直找不到正确的组合。 问题答案: 最短的答

  • 问题内容: 我希望UserAcounts可以有许多UserGroups,而所有Groups可以有许多Users。还有一个联接表。我希望在删除useraccount时删除联接表中useraccount和usergroup之间的关系。 实际上,我想使用“在删除级联上”。在ManyToMany关系中,我不会不幸地运行它。我已经尝试了很多事情,但没有找到解决方案。 注意:我只想在删除级联上删除关系 是否有

  • 问题内容: 我相信只有两种使用Hibernate加载对象的方法,即延迟加载和一种渴望加载。延迟加载有其自身的优势,它不会加载很多对象,而只是在需要时才加载它们。我还了解到,如果您想强制为一个对象加载所有子代,则只需调用即可。假设我们有以下对象 假设我们有一些客户在我们的系统中有订单,并且该订单可能不止一个甚至为空。所以我的问题是,在这种情况下始终使用渴望加载会更好吗?我们需要与客户相关的订单的大小

  • 问题内容: 我对HQL查询和hibernate有疑问。 我有一个用户类和一个角色类。用户可以具有许多角色。所以我有一个像这样的ManyToMany关系: 在用户类别中: 在角色类中: 此映射创建了存储关系的第三个表(PORTAIL_USERROLE)。像这样一切正常。当我有一个用户时,我将检索角色。 但是,我的问题是:在HQL查询中,如何获得具有特定角色的所有用户?任何类都代表PORTAIL_US

  • 问题内容: 我看到很多帖子,其中Eager fetch在休眠状态下执行子表父表的左连接。但是当我使用springboot时,hibernate会触发单独的sql查询- 意味着一个针对父表的选择查询和一个针对子表的选择查询。为什么有区别?springboot是否进行了升级,或者我做错了什么? 以下是我正在使用的实体: 订单实体: 客户实体: 控制器: 仓库: 以下是正在执行的查询: 编辑:这与@Fe