簡體   English   中英

在grails 2.4.1中,delete()不再存在

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM