1

给定以下两个域类:

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 保存这本书的最佳方法是什么?或者为什么验证失败时数据绑定完成的关联没有正确回滚?

4

1 回答 1

0

如果您已指定您的服务是事务性的,那么任何未捕获的异常都会导致事务在服务方法中回滚。唯一可能阻碍您的是您的 RDBMS 不支持真正的事务/回滚。

您是否指定了服务是否是事务性的?您应该有如下声明来声明服务是事务性的。

def transactional = true
于 2011-05-27T14:10:01.550 回答