验证后对象未保留,没有错误

时间:2017-03-13 17:25:08

标签: grails gorm

我从Grails 2.4.5(Hibernate 3)迁移到Grails 3.1.15(Hibernate 4)并注意到我的一些控制器操作不再起作用。

我有以下行动(简化)

def create() {
        def myDomainObject = myDomainservice.getDefault()
        if (myDomainObject.validate()) {
            myDomainObject.save()
            render 'OK'
        } else {
            render 'WRONG'
        }
}

这个动作在Grails 2中运行良好。当验证没有返回任何错误时,就创建了一个对象。

然而,在Grails 3中,这已不再适用。动作调用执行时没有错误,但对象未存储在db中(但是已分配id)。

经过一些故障排除后,我得出的结论是validate()忽略save()(验证()没有检测到任何问题)。

添加@Transactional或明确刷新save(flush:true)可解决问题。

我能恢复原来的行为吗?

我已经检查了hibernate.flush.mode = AUTO,但两个版本都相同。

1 个答案:

答案 0 :(得分:0)

Grails团队不鼓励控制器中的核心应用程序逻辑(作为域保存)至少由于不洁separation of conserns

尝试将您的逻辑移动到服务(默认情况下它们是事务性的,即使用@Transactional注释)并且您一次覆盖2个目标:

  1. 清洁代码
  2. 工作功能