weixin_42364851 2010-05-07 10:07
浏览 222
已采纳

hibernate懒加载问题

举例说明

用户表-角色表-权限表三表多对多(ManyToMany)关联,其中如果用户-角色级联fetch=eager,角色和权限对应的必须为lazy,否则会抛异常org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

请问如果3表都像配置fetch=eager如何解决,小弟在此先谢过!

  • 写回答

1条回答 默认 最新

  • 紫翎观星 2010-05-09 17:31
    关注

    Hibernate Annotation的 *ToOne默认的FetchType是EAGER的,fetch=FetchType.EAGER加载数据的时候是一次性加载可能会造成不必要的性能浪费,使用是应该慎重考虑。
    对于你这个是3表多对多,在抓取策略上可以考虑使用子查询抓取@Fetch(FetchMode.SUBSELECT)。
    [code="java"]
    @ManyToMany
    @JoinTable(name = "T_USER_ROLE", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    @Fetch(FetchMode.SUBSELECT)
    public Set getRoles() {
    return roles;
    }
    [/code]
    @Fetch(FetchMode.SUBSELECT)产生两条sql语句,第二条语句使用id in (.....)查询出所有关联的数据。除非你显式的指定lazy="false"禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 优质github账号直接兑换rmb,感兴趣伙伴可以私信
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)