我有一个包含方法的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会话。所以我在这里有点束手无策了。有人知道是什么问题吗?
在访问数据库之前使用session.open()
,通过显式指定close
为一个解决方案。伯特·贝克维斯的《Here》也是一个很好的答案。
如果有帮助,请用他的例子。
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()
}
}