给出以下两个域类:
class Book {
String title
static hasMany = [authors: Author]
static belongsTo = Author
static constraints = {
title(nullable: false)
}
}
class Author {
static hasMany = [books: Books]
}
我们在服务中创建和保留域对象,并利用Grails的数据绑定功能。这种方法如下所示:
def createAndPersistBook(params) throws ValidationException {
log.debug("Attempt to create and persist book")
Book book = new Book(params)
book.save(flush: true, failOnError: true)
log.debug("Created: ${book}")
book
}
当我们传递params
地图
params = ["authors": "[2]"]
到服务方法(没有定义标题,因此验证将失败)从新创建的书到现有作者的关联(反之亦然)是通过数据绑定完成的。但由于标题为nullable: false
且未定义,因此抛出ValidationException
并回滚事务。
我们现在所期望的是该书未被保存,但Book.list().isEmpty()
返回false。我们认为这是因为hibernate的脏检查,这意味着现有books
的{{1}}集合已经更改并将被保留,并且此保存会级联到图书实例。
在这种情况下,防止grails保存图书的最佳方法是什么?或者,为什么通过数据绑定完成的关联在验证失败时没有正确回滚?
答案 0 :(得分:0)
如果您已指定您的服务是事务性的,则任何未捕获的异常都将导致事务在服务方法中回滚。唯一可能阻碍您的方法是您的RDBMS不支持真正的事务/回滚。
您是否指定该服务是否为交易服务?您应该有一个如下所示的声明来声明该服务是事务性的。
def transactional = true