2016-08-26 60 views
1

我在獲取事件處理程序方法中的會話時遇到問題。 Grails的版本:3.0.11'處理事件時未找到當前線程的會話'

所以,代碼本身:

class FooController { 

    def notifyFoo(Long id) { 
     notify('Foo:foo', id) 
     sendSuccessMessage(message(code: 'Message.Text.Success')) 
    } 
} 

@Consumer 
class BarService { 

    static transactional = false 

    @Selector('Foo:foo') 
    @Transactional 
    def onFoo(Long fooId) { 
     Baz baz = Baz.findByFooId(fooId) 
     baz.bazProp++ 
     **baz.save()** /*Here i get the error about 'No session found'*/ 
    } 
} 

我曾嘗試不同的方法來解決這個問題:

  • 移動所有的業務邏輯到另一種方法,是標記爲@Transactional,並明確地從onFoo()方法調用它
  • 用baz.withTransaction {},Baz.withSession {},Baz.withNewSession {}封裝onFoo()內的業務邏輯{}關閉

在任何情況下,我得到了同樣的錯誤:org.hibernate.HibernateException:無會話發現當前線程

誰能幫助我與我的問題?我究竟做錯了什麼?

回答

1

你不應該在同一個服務相結合static transactional = false@Transactional - 使用一種或另一種:

  • 如果所有的服務方法都不能交易的使用static transactional = false
  • 如果所有的服務方法都需要一個讀/寫交易中使用的static transactional = true
  • 如果(同一服務)不同的方法有不同的事務性語義,使用註釋

在Grails 3.X中,不推薦使用靜態註釋,所以只應使用註釋。

+0

是的,我知道。這段代碼只是我真正的項目代碼的一個必備部分。當然,該服務中有很多方法不應該包含在事務中,這就是爲什麼我使用'static transactional = false' –

相關問題