这大致是我在服务中所做的:
runAsync
{
<some work here>
myDomainObject.merge()
}
我收到一条错误消息,提示“没有绑定到线程的休眠会话,并且配置不允许在此处创建非事务性会话”。我确定代码是异步运行的,因此执行器插件似乎设置正确。
所以我接下来尝试了这个,认为域对象“myDomainObject”不能绑定在这个线程中,尽管线程有一个休眠会话,这要归功于执行器插件:
runAsync
{
<work>
def instance2= MyDomainObject.get(myDomainObject.id) // works
instance2.field1=123
instance2.save() // fails
}
我在这里遇到了同样的错误,有趣的是,get() 成功地带来了正确的数据并将其设置为 instance2。只有“save()”失败。我知道这一点是因为我已经在调试器中逐步完成了代码。
最后,如果我执行以下操作,一切正常:
runAsync
{
<some work here>
MyDomainObject.withTransaction {
myDomainObject.field1=123
myDomainObject.merge()
}
}
我不明白为什么需要此事务,因为我尚未将编写上述代码的服务设置为事务性的。我知道这里肯定有一些我不知道的基本知识,但我不知道它是什么。