我正在尝试使用flush:true
更新数据库以进行save()
操作。调试器显示状态已更新,但是当我使用此sql时
Select * from domain_name where id = 123
我仍然处于旧状态。
我使用Quartz插件运行从同一个表中读取的预定cron作业:
DomainName.withTransaction{ status ->
try
{
DomainName name = DomainName.get(123)
name.status = "newstatus"
name.save(flush:true,failOnError:true)
}
catch(Exception rte)
{
log.error "Update failed with error ${rte.message}"
status.setRollbackOnly()
}
}
有没有人遇到过类似的问题?在config.groovy中打开hibernate日志时没有错误
debug 'org.hibernate.SQL'
'org.hibernate.transaction'
答案 0 :(得分:1)
我遇到过这个问题。事实证明,要更新的实例是通过动态查找器获得的。一旦我使用get(id)获取实例,值就会保存到数据库表中。
在故障排除期间,我打开了sql日志记录。当该行应该更新时,当通过finder获取实例时,没有更新语句写入控制台。使用get(id)将update语句写入控制台。
答案 1 :(得分:0)
我认为问题存在于您给定的代码块之前。
您是否在此交易之前使用脏检查(例如Domain.get()
)拉出该对象,该交易仍然存在?我的建议是仔细检查您的代码,从所有脏检查中分离(例如使用Domain.discard()
),然后重试。这应该可以解决你的问题。
答案 2 :(得分:0)
我遇到了类似的问题。我通过动态方法获取对象。然后将属性传递给另一个方法。在另一种方法中,我再次通过动态查找器获取对象。
我保存了域对象,但没有保存。我尝试了failOnError
以及flush
,但没有效果。
我传递了域对象而不是使用动态查找器,但它确实有效。