删除即使在服务中也不起作用?

时间:2018-07-16 04:52:42

标签: grails grails3

我有图书领域

package bookfinal

class Book {

    String name
    static constraints = {
    }
}

Book Controller如下

package bookfinal

class BookController {

    def bookService

    def destroy(Long id){
        bookService.destroy(id)
        redirect(action:'index')
    }

    def index() {

        [books: Book.findAll()]
    }

    def create(){

    }

    def save(){
        def book = new Book(params)
        book.save()
        redirect(action:'show', id:book.id)
    }

    def edit(Long id){
        [book: Book.get(id)]
    }

    def update(Long id){
        bookService.update(id, params)
        redirect(action:'index')
    }

    def show(Long id){
        [book: Book.get(id)]
    }


}

服务如下

package bookfinal

import grails.gorm.transactions.Transactional

@Transactional
class BookService {

    def destroy(Long id) {

        def b = Book.get(id)
        b.delete()

    }


    def update(Long id, params){

        def book = Book.get(id)
        book.properties = params
        book.save()
    }

}

显示页面如下

<h1> ${book.name} </h1>

<g:link action="edit" id="${book.id}">Edit</g:link>
<g:link action="destroy" id="${book.id}">Delete</g:link>
<g:link action="index">Back</g:link>

现在,当我单击“删除”时,它将重定向到索引,但未删除记录。为什么删除甚至在服务中也不起作用?我正在使用Grails 3.3.2版本。当我执行delete(flush:true)时,它可以工作,但我希望只是delete()在服务中工作,因为它是事务性的。我有什么想念的吗?感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

这是Grails3的变化之一。选中official Grails3 docs

save方法通知持久性上下文应保存或更新实例。除非使用flush参数,否则该对象将不会立即保留

More info

在早期版本的GORM中,刷新模式默认为AUTO。使用此设置后,无论是否存在事务,都将在每次查询之前刷新会话。

如果开发人员不能完全理解AUTO的行为,那么在查询之前频繁刷新会话可能会导致意外的性能后果。

请牢记,COMMIT是GORM 6中新的默认刷新模式,它将在事务提交时刷新会话。您可以通过在应用程序配置(例如application.yml)中配置刷新模式来恢复以前的行为:

hibernate:
    flush:
        mode: AUTO