我有一个包含方法的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会话。所以我在这里结束了我的智慧。有谁知道问题可能是什么?
答案 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()
}
}