'save'不起作用,尝试了flush和failOnError:true但没有给出错误

时间:2013-08-04 09:19:13

标签: grails gorm

我正在尝试使用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' 

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

您是否在此交易之前使用脏检查(例如Domain.get())拉出该对象,该交易仍然存在?我的建议是仔细检查您的代码,从所有脏检查中分离(例如使用Domain.discard()),然后重试。这应该可以解决你的问题。

答案 2 :(得分:0)

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

我保存了域对象,但没有保存。我尝试了failOnError以及flush,但没有效果。

我传递了域对象而不是使用动态查找器,但它确实有效。