云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          我使用的是annotation方式的hibernate配置。結(jié)果在啟動Tomcat的時候報錯:
          Invocation of init method failed; nested exception is org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
          解決方法:
          去除Annotation中的所有FetchType="EAGAR"




          評論

          # re: Hibernate啟動報錯cannot simultaneously fetch multiple bags  回復  更多評論   

          2013-05-22 10:09 by 黃威
          cannot simultaneously fetch multiple bags異常是由于持久層實時加載太多異同對象而致。例如用戶登錄時,同步實時加載用戶的角色對象、權(quán)限對象,而往往這些關(guān)系都是多對多關(guān)系,就單一列內(nèi)容來看存在重復的值,從而引起multiple bags。我在網(wǎng)上搜索這類結(jié)果,幾乎都提出一個解決辦法——采用延遲加載,即fetch=FetchType.LAZY,這樣就束縛了框架的強大功能,也有提過用@IndexColumn解決,但@IndexColumn是Hibernate的東西,不是JPA規(guī)范(下文有討論)。既要實時加載,又保證不會出現(xiàn)主題問題,這就是本文所要探討的。

          JPA規(guī)范中,一對多或多對多的多方數(shù)據(jù)抓取過來后必須用容器類存,例如Set、List、Map等,初學者可能沒有對這個幾個容器認真研究,隨便拿一個就用。事實上這幾個容器有很大的區(qū)別,本文不具體討論這些容器的區(qū)別和功能,但提一個特別要注意的區(qū)別——導致本文主題的產(chǎn)生——就是容器內(nèi)是否允許重復值,那讓們簡單地了解下這此容器的特性:

          Set:

          _Set中不允許存放重復元素;
          _Set中的元素是無序的。

          List:

          _List中可以存放重復元素;
          _List中的元素是一個有序的集合,可以通過訪問List中的元素。

          Map:

          _Map是以鍵/值存放數(shù)據(jù),因此它有較高的存取性能;
          _Map中不允許重復的鍵,但可以有重復的值

          有了這些區(qū)別,我們就可以開始尋找主題問題,當持久框架抓取一方的對象時,同時加載多方的對象放進容器中,多方又可能與關(guān)聯(lián)其它對象,Hibernate實現(xiàn)的JPA,默認最高抓取深度含本身級為四級(它有個屬性配置是0-3),若多方(第二級)存在重復值,則第三級中抓取的值就無法映射,按照這個道理,就應(yīng)該報出無法同時加載多個包之異常。由于國內(nèi)EJB3.0以后的教材是少而甚少,更沒有較完善的JPA手冊,所以筆者這樣的理解可能會引起質(zhì)疑,但事實上,筆者是通過這個思路解決了問題:

          即@ManyToMany或@OneToMany的Many方此時一定用Set容器來存放,而不能用List集合。

          不過Hibernate有些功能超越了JPA規(guī)范,它支持真正的List集合,映射集合的方式和以前完全一樣,只不過要新增 @IndexColumn注解,該注解允許你指明存放索引值的字段。但實際上是創(chuàng)建唯一性索引,抓取多方的結(jié)果也是唯一的,就是上述Set容器不允許重復元素的道理一樣。

          出現(xiàn)此異常的讀者,先看看自己是不是用了List集合而導致此問題的發(fā)生,若是用Set還出現(xiàn)此問題,則去看Set容器內(nèi)的對象的類中是不是還有類似問題。

          # re: Hibernate啟動報錯cannot simultaneously fetch multiple bags  回復  更多評論   

          2013-06-23 13:05 by usherlight
          @黃威

          謝謝你詳盡的解釋
          主站蜘蛛池模板: 彰化县| 吴忠市| 江源县| 夏邑县| 武鸣县| 察隅县| 海盐县| 马龙县| 民丰县| 库尔勒市| 屏南县| 沭阳县| 兴化市| 永新县| 涟源市| 龙门县| 浠水县| 大庆市| 抚顺县| 盖州市| 永登县| 花垣县| 浠水县| 五原县| 绵阳市| 广州市| 双城市| 美姑县| 灵丘县| 甘孜县| 阿荣旗| 星子县| 开阳县| 沙湾县| 南开区| 松阳县| 远安县| 萨嘎县| 吴堡县| 榆中县| 阿克苏市|