我从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
,但两个版本都相同。
答案 0 :(得分:0)
Grails团队不鼓励控制器中的核心应用程序逻辑(作为域保存)至少由于不洁separation of conserns。
尝试将您的逻辑移动到服务(默认情况下它们是事务性的,即使用@Transactional注释)并且您一次覆盖2个目标: