0

我正在尝试使用flush:trueforsave()操作更新数据库。调试器显示状态已更新,但是当我使用这个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 log没有错误

debug 'org.hibernate.SQL' 
    'org.hibernate.transaction' 
4

3 回答 3

1

我遇到了这个问题。事实证明,要更新的实例是通过动态查找器获得的。一旦我使用 get(id) 获取实例,这些值就会保存到数据库表中。

在故障排除期间,我打开了 sql 日志记录。当应该更新该行时,当通过查找器获取实例时,没有将更新语句写入控制台。使用 get(id) 将更新语句写入控制台。

于 2015-05-29T12:55:30.877 回答
0

我认为问题出在您给定的代码块之前。

您是否在此事务之前使用脏检查(例如)拉出该对象,Domain.get()该事务仍然存在?我的建议是仔细检查您的代码,脱离所有脏检查(例如 use Domain.discard())并重试。那应该可以解决您的问题。

于 2013-08-05T19:10:28.327 回答
0

我面临着类似的问题。我通过动态方法获取对象。然后将属性传递给另一个方法。在另一种方法中,我再次通过动态查找器获取对象。

我保存了域对象,但它没有被保存。我试过failOnError了,flush但没有奏效。

我传递了域对象而不是使用动态查找器并且它有效。

于 2015-06-30T07:33:33.363 回答