異常信息以下:html
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bagslinux
......框架
問題是何時出現的呢?fetch
當一個實體對象中包含多於一個non-lazy獲取策略時,好比@OneToMany,@ManyToMany或者@ElementCollection時,獲取策略爲(fetch = FetchType.EAGER)spa
出現問題的緣由:hibernate
當(fetch = FetchType.EAGER)多餘一個時,持久框架抓取一方的對象時,同時又將多方的對象加載進容器中,多方又可能關聯其它對象,Hibernate實現的JPA,默認最高抓取深度含自己級爲四級(它有個屬性配置是0-3),若多方(第二級)存在重複值,則第三級中抓取的值就沒法映射,就會出現 multiple bags。htm
解決方法:對象
一、將(fetch = FetchType.EAGER)改成(fetch = FetchType.LAZY)索引
二、將List修改爲Set集合,即推薦@ManyToMany或@OneToMany的Many方此時用Set容器來存放,而不用List集合。ip
三、改變FetchMode爲@Fetch(FetchMode.SUBSELECT),即發送另一條select語句抓取前面查詢到的全部實體對象的關聯實體。
四、在對應的屬性上添加@IndexColumn,該註解容許你指明存放索引值的字段,目的跟Set容器不容許重複元素的道理同樣。
推薦的處理辦法:
方法2;
方法3和方法4是Hibernate特有的,非JPA標準;
若是能夠用方法1,那就不會出現這個問題。
參考: