JPA的cannot simultaneously fetch multiple bags异常的解决

cannot simultaneously fetch multiple bags异常是由于持久层实时加载太多异同对象而致。例如用户登录时,同步实时加载用户的角色对象、权限对象,而往往这些关系都是多对多关系,就单一列内容来看存在重复的值,从而引起multiple bags。

百度之后有四种解决办法:

1.将List变为Set

2.fetch=FetchType.LAZY

3.@Fetch(FetchMode.SUBSELECT)

4.@IndexColumn

经实测方法一,方法三有效,方法二束缚了框架的强大功能,不适合我的程序,之前就是说懒加载导致搜索数据出错才把FetchType.LAZY 修改为FetchType.EAGER,方法四加入之后报错,看到有文章说@IndexColumn是Hibernate的东西,不是JPA规范,这个还没找官方文档验证。

方法一的解释:

Set:

_Set中不允许存放重复元素;
_Set中的元素是无序的。

List:

_List中可以存放重复元素;
_List中的元素是一个有序的集合,可以通过访问List中的元素。

Map:

_Map是以键/值存放数据,因此它有较高的存取性能;
_Map中不允许重复的键,但可以有重复的值

    当持久框架抓取一方的对象时,同时加载多方的对象放进容器中,多方又可能与关联其它对象,Hibernate实现的JPA,默认最高抓取深度含本身级为四级(它有个属性配置是0-3),若多方(第二级)存在重复值,则第三级中抓取的值就无法映射,按照这个道理,就应该报出无法同时加载多个包之异常。即@ManyToMany或@OneToMany的Many方此时一定用Set容器来存放,而不能用List集合。

方法三FetchMode.SUBSELECT 会另外发送一条select语句抓取前面查询到的所有实体对象的关联实体。

参考:http://howsun.blog.sohu.com/119020926.html

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值