我正在从Grails 2.4.5(Hibernate 3)中迁移到Grails 3.1.15(Hibernate 4),并注意到我的某些控制器动作不再起作用。p>我有以下操作(简化)
def create() {
def myDomainObject = myDomainservice.getDefault()
if (myDomainObject.validate()) {
myDomainObject.save()
render 'OK'
} else {
render 'WRONG'
}
}
此操作在Grails 2中正常工作。
在Grails 3中,这已经不再如此。操作调用没有错误执行,但对象未存储在DB中(但是分配了ID)。
进行了一些故障排除后,我得出一个结论,呼叫validate()
以某种方式忽略save()
(Validate()未检测到任何问题)。
添加@Transactional
或明确冲洗save(flush:true)
解决了问题。
我能够恢复旧行为吗?
我已经检查了hibernate.flush.mode = AUTO
,并且在两个版本中都是相同的。
核心应用程序逻辑(作为域保存)至少由于consern的不干净分离而被控制器中的控制器不建议使用。
尝试将您的逻辑移至服务(默认情况下是交易的,即用@transactional注释),您一次涵盖了2个目标:
- 清洁器代码
- 工作功能