Grails Service抛出异常“org.hibernate.HibernateException:没有Hibernate Session绑定到线程,配置不允许......”

时间:2014-06-02 08:54:41

标签: hibernate grails gorm

我有一个包含方法的Grails服务

@Transactional
def method(param1, param2, param3, param4) {
    SomeClass obj = new SomeClass(param1: param1, param2: param2, param3: param3, param4: param4)
    obj.save(flush:true, failOnError:true)
}

即使我提供了“failOnError”参数,该方法也会无声地失败。这已经花了我一些时间来弄明白,所以我把它改成了:

@Transactional
def method(param1, param2, param3, param4) {
    try {
        SomeClass obj = new SomeClass(param1: param1, param2: param2, param3: param3, param4: param4)
        obj.save(flush:true, failOnError:true)
    } catch (Throwable t) {
        t.printStackTrace()
    }
}

现在,最后,我看到错误消息:“没有Hibernate会话绑定到线程,配置不允许在这里创建非事务性的”。这很奇怪。我一直认为“@Transactional”会为我提供有效的Hibernate会话。所以我在这里结束了我的智慧。有谁知道问题可能是什么?

1 个答案:

答案 0 :(得分:1)

在访问数据库之前使用session.open(),并通过明确指定为一个解决方案close。还有一个很好的答案细节是Here by Burt Beckwith.

如果有帮助,请使用他的例子。

void deviceDisconnected(String mobileId, String wifiIp){
   try {
      UserMobile.withTransaction { tx ->
         def mobile = Mobile.findByMobileId(mobileId)
         def userMobile = UserMobile.findByMobileAndWifiIp(mobile, wifiIp)
         userMobile.action = Constants.MOBILE_STATUS_DISCONNECTED
         userMobile.alarmStatus = Constants.ALARM_STATUS_TURNED_ON
         userMobile.modifiedDate = new Date()
         userMobile.save(flush: true)
      }
   }
   catch(e) {
      e.printStackTrace()
   }
}