cannot simultaneously fetch multiple bags 異常的解決辦法

異常信息以下: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,那就不會出現這個問題。

參考:

        http://www.linuxso.com/architecture/22611.html

相關文章
相關標籤/搜索