我有图书领域
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()在服务中工作,因为它是事务性的。我有什么想念的吗?感谢您的帮助。谢谢!
答案 0 :(得分:0)
这是Grails3的变化之一。选中official Grails3 docs:
save
方法通知持久性上下文应保存或更新实例。除非使用flush
参数,否则该对象将不会立即保留
在早期版本的GORM中,刷新模式默认为AUTO。使用此设置后,无论是否存在事务,都将在每次查询之前刷新会话。
如果开发人员不能完全理解AUTO
的行为,那么在查询之前频繁刷新会话可能会导致意外的性能后果。
请牢记,COMMIT
是GORM 6中新的默认刷新模式,它将在事务提交时刷新会话。您可以通过在应用程序配置(例如application.yml)中配置刷新模式来恢复以前的行为:
hibernate:
flush:
mode: AUTO