[转]cannot simultaneously fetch multiple bags 问题的解决办法

完整的异常信息如下:

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
  at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94)
  at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:119)
  at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:71)
  at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:54)
  at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:133)
  at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1914)
  at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1937)
  at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3205)
  at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191)
  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348)
  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
  at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
  at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)

问题是什么时候出现的呢?

当一个实体对象中包含多于一个non-lazy获取策略时,比如@OneToMany,@ManyToMany或者@ElementCollection时,获取策略为(fetch = FetchType.EAGER)

出现问题的原因:

当(fetch = FetchType.EAGER)多余一个时,持久框架抓取一方的对象时,同时又将多方的对象加载进容器中,多方又可能关联其它对象,Hibernate实现的JPA,默认最高抓取深度含本身级为四级(它有个属性配置是0-3),若多方(第二级)存在重复值,则第三级中抓取的值就无法映射,就会出现 multiple bags。

解决方法:

1、将(fetch = FetchType.EAGER)改为(fetch = FetchType.LAZY)

2、将List修改成Set集合,即推荐@ManyToMany或@OneToMany的Many方此时用Set容器来存放,而不用List集合。

3、改变FetchMode为@Fetch(FetchMode.SUBSELECT),即发送另外一条select语句抓取前面查询到的所有实体对象的关联实体。

4、在对应的属性上添加@IndexColumn,该注解允许你指明存放索引值的字段,目的跟Set容器不允许重复元素的道理一样。

推荐的处理办法:

方法2;

方法3和方法4是Hibernate特有的,非JPA标准;

如果可以用方法1,那就不会出现这个问题。

参考:

1、http://blog.eyallupu.com/2010/06/hibernate-exception-simultaneously.html
2、http://dyldragon.iteye.com/blog/788385
3、http://howsun.blog.sohu.com/119020926.html

转自 : http://www.quanlei.com/2011/10/2817.html

[转]cannot simultaneously fetch multiple bags 问题的解决办法

时间: 2024-11-09 01:26:29

[转]cannot simultaneously fetch multiple bags 问题的解决办法的相关文章

“cannot simultaneously fetch multiple bags”的解决方法

Java代码   @OneToMany(mappedBy = "customer",cascade = {CascadeType.ALL},fetch = FetchType.LAZY) private Collection<CartItem> cartItems; @OneToMany(mappedBy = "customer",cascade = {CascadeType.ALL},fetch = FetchType.EAGER) private C

cannot simultaneously fetch multiple bags

问题是什么时候出现的呢?    当一个实体对象中包含多于一个non-lazy获取策略时,比如@OneToMany,@ManyToMany或者@ElementCollection时,获取策略为(fetch = FetchType.EAGER) 出现问题的原因:    当(fetch = FetchType.EAGER)多余一个时,持久框架抓取一方的对象时,同时又将多方的对象加载进容器中,多方又可能关联其它对象,Hibernate实现的JPA,默认最高抓取深度含本身级为四级(它有个属性配置是0-3)

fetch使用的常见问题及其解决办法

摘自: https://segmentfault.com/a/1190000008484070 fetch使用的常见问题及其解决办法 javascript wonyun 2月25日发布 |   0 收藏  |  17 2.4k 次浏览 首先声明一下,本文不是要讲解fetch的具体用法,不清楚的可以参考MDN fetch教程. 引言 说道fetch就不得不提XMLHttpRequest了,XHR在发送web请求时需要开发者配置相关请求信息和成功后的回调,尽管开发者只关心请求成功后的业务处理,但是也

Unable to execute dex: Multiple dex files define 解决办法

描述: eclipse开发的程序,编译没错误,但是run的时候报错 Unable to execute dex: Multiple dex files define 网上找了好多答案,最后终于被解决了 此问题是因为你有重复引用的jar包.  解决办法是查看你的build path,尤其是Android Dependencies一定有重复引入的.jar包,解决的方法是在libs删除重复的jar包即可 参考的这位:http://blog.sina.com.cn/s/blog_4b9b6ad00101

Error: Can&#39;t place multiple pins assigned to pin location……解决办法

转载:http://blog.sina.com.cn/s/blog_6f0eeb3301014pi7.html 今天用DE0做VGA实验,在分配管脚后全编译出现下面这样的错误: Error: Can't place multiple pins assigned to pin location Pin_K22 (IOPAD_X41_Y19_N14) Info: Pin B[0] is assigned to pin location Pin_K22 (IOPAD_X41_Y19_N14) Info

Unable to execute dex: Multiple dex files define 解决方法

问题发生概述:       程序编译正常,在用Eclipse调试执行时,报错Unable to execute dex: Multiple dex files define,因为以前也没有遇到这类错误,首先便尝试万能纠错发,如下方法一,也是上网搜索众多解决方案之一,尝试后未果,便按照搜索方案,逐一尝试,都未能解决,最后盯着工程突然发现问题.具体解决方案如下: 方法一:       Eclipse->Project->去掉Build Automatically->Clear ->Bu

Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法

Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法

使用cocoapods出现问题fetch of the ‘master’ 的解决方法

更新cocoapod的时候会出现 Performing a deep fetch of the `master` specs repo to improve future performance 的错误. 纠结半天,是因为pod steup的时候创建master这个库,没成功,之后就算移除镜像重新安装的话 默认是从matser库里获取,导致安装不成功. 解决办法是移除master库,重新创建. pod repo upadte --verbose   rm -rf ~/.cocoapods/rep

Error (10028): Can&#39;t resolve multiple constant drivers for net &quot;out2&quot; at shiyan.v(14)解决办法

//Error(10028):Can't resolve multiple constant drivers for net “ ” at **.v //两个进程里都有同一个条件判断的话,会产生并行信号冲突的问题. //同一个信号不允许在多个进程中赋值,否则则为多驱动. //进程的并行性决定了多进程不同能对同一个对象进行赋值. 1 module test(c1,c2,out1,out2); 2 3 input c1,c2; 4 output out1,out2; 5 6 reg out1,out