2013-04-11 124 views
9

我有以下結構的方法:的Grails GORM:無法初始化代理 - 沒有會話

public void run(){ 
    ... 
    for (...) { //this part works correct 

     User.withTransaction { 
      User user = User.findByUsername(...); 

      Position pos = Position.findByName(...) 
      if(pos){ ... 
      } else { ... 
       try{ 
        pos.save(flush:true); 
        user.position = pos; 
       } catch (Exception e){ ... } 
      } 
      ... 
      try{ 
       user.save(flush:true, failOnError: true); 
      } catch (Exception e){ ... } 
     } 
    } 
    //this part doesn't work 
    User.findAll().each { 
    ... 
     if (...){ 
      User.withTransaction{ 
       ... 
       //here the operation fails with 
       //org.hibernate.LazyInitializationException: 
       //could not initialize proxy - no Session 
       if (!userDetailsMap.containsKey(it.username) 
         && it.userStatus != blocked){ 
        it.userStatus = blocked 
        it.save(flush:true) 
       } 
      } 
     } 
    } 
} 

我得到這裏唯一的例外是在我的代碼的第二部分org.hibernate.LazyInitializationException: could not initialize proxy - no Session。這裏的userStatus字段是對不同域類的引用。

我試着在檢查屬性之前將it.refresh()Hibernate.initialize(it)添加到代碼中,但沒有用。我在這裏做錯了什麼?

更新:我試圖在檢查屬性之前調用it.attach方法,但在方法調用it.attached的值之後是false

+0

您是否在視圖中調用此方法? – 2013-04-11 11:35:12

+0

@SérgioMichels,不,這個方法是由調度器調用的。任務被添加到調用'run()'方法的調度器中。 – svz 2013-04-11 11:54:24

回答

18

我不認爲你在做任何'錯誤',只是該對象從休眠會話中分離出來。一對夫婦的事情,我想嘗試:

+0

我已經嘗試添加'it.attach()'行,但沒有成功。將嘗試第二個選項。 – svz 2013-04-11 11:56:00

+0

這裏很奇怪的是,在調用'it.attach()'之後,'it.attached'值爲false。 – svz 2013-04-11 12:05:05

+2

讓域名類之間的關聯非懶惰終於有所幫助,但我認爲這不是最好的解決方案。不過,這是迄今爲止唯一的一個。 – svz 2013-04-11 12:22:07

0

我不得不當我使用的子域類爲一類,如果你的數據大小比頁面大小更完全相同的錯誤,你會得到錯誤「消息:無法初始化代理 - 沒有會話「

通過usi ng <> lazy:false,hibernate將正確使用會話附件,並將顯示適當的數據。

感謝您發佈此信息。我能夠解決我的錯誤。

0

Thomas Farvour指出了正確的方向。文檔13.1.1「事務回滾」和「會話」建議儘可能提高孩子的最佳解決方案。

相關問題