[英]delete() not does persist anymore in grails 2.4.1
在將項目從1.3.7遷移到2.4.1時,我偶然發現了幾件事。 其中之一是,我發現obj.delete()
在2.4.1中不再存在,除非使用obj.delete(flush:true)
。
當我閱讀Grails UserGuide時說“ ...實例被立即刪除”時,我理解flush:true
參數是強制立即持久存儲對象的選項,而不是“在休眠狀態認為正常時將其保留”。
但是,如果obj.delete()
從不真正刪除對象,就無法將刪除保留在數據庫中,那么我就不知道有這種可能性。
我在具有以下工件的演示應用程序中對此進行了測試:
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應用程序中創建的控制器默認為只讀事務。 盡管我不確定100%,但這可能是您看到此消息的原因。
不過,您應該始終在事務內執行刪除操作,因此最好的辦法是將刪除操作移至服務並從那里進行操作(推薦),或者使用grails.transaction.Transactional
注釋控制器操作,這將確保刪除操作是在控制器執行結束時提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.