处理事件时“找不到当前线程的会话”

时间:2016-08-26 13:40:43

标签: events grails

我在事件处理程序方法中获取会话时遇到问题。 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 个答案:

答案 0 :(得分:1)

您不应将static transactional = false@Transactional合并到同一服务中 - 使用其中一种:

  • 如果所有服务方法都不是事务性使用static transactional = false
  • 如果所有服务方法都需要使用static transactional = true
  • 进行读/写事务
  • 如果(同一服务的)不同方法具有不同的事务语义,请使用注释

在Grails 3.X中,不推荐使用静态注释,因此只应使用注释。