在将项目从1.3.7迁移到2.4.1时,我偶然发现了几件事。其中之一是,我发现obj.delete()
在2.4.1中不再存在,除非我使用obj.delete(flush:true)
。
当我阅读Grails UserGuide时说“...实例被立即删除”时,我了解到flush:true
参数是一种强制立即持久存储对象的选项,而不是“在休眠状态认为正常时将其保留”。
但是,如果obj.delete()
从不会真正将对象删除到允许删除到数据库的 Angular 来看,我就不会知道这种可能性。
我在具有以下 Artifact 的演示应用程序中对此进行了测试:
class Msg {
String text
}
和:
class MsgController {
def index() {
[list:Msg.list()]
}
def create() {
def msg = new Msg(text:'hallo '+Msg.count())
msg.save()
redirect action:'index'
}
// this delete does NOT delete the object (hibernate creates no sql "delete from ..." command)
def delete1() {
def msg = Msg.get(params.id)
msg.delete()
flash.message = "msg [$msg.text] with id $msg.id deleted"
redirect action:'index'
}
// this delete does delete the object
def delete2() {
def msg = Msg.get(params.id)
msg.delete(flush:true)
flash.message = "msg [$msg.text] with id $msg.id deleted using flush:true"
redirect action:'index'
}
}
和index.gsp:
<g:if test="${flash.message}">
<p>${flash.message}</p>
</g:if>
<p>
<g:link action="index">index</g:link>,
<g:link action="create">create</g:link>
</p>
<p>
<g:each in="${list}" var="msg">
${msg.id}: [${msg.text}], ***
<g:link action="delete1" id="${msg.id}">delete()</g:link>
<g:link action="delete2" id="${msg.id}">delete(flush:true)</g:link>
<br>
</g:each>
</p>
最佳答案
由于性能原因,在2.4应用程序中创建的 Controller 默认为只读事务。尽管我不确定100%,但这可能是您看到此消息的原因。
不过,您应该始终在事务内执行删除操作,因此最好的做法是将删除操作移至服务并从那里进行操作(推荐),或者使用grails.transaction.Transactional
注释 Controller 操作,这将确保删除操作在最后完成 Controller 执行。
关于grails - delete()在grails 2.4.1中不再存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24403679/