给定以下两个域类:
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
现有的集合author
已经改变并且将被持久化并且这个保存被级联到 book 实例。
在这种情况下,防止 grails 保存这本书的最佳方法是什么?或者为什么验证失败时数据绑定完成的关联没有正确回滚?