Grails:通过服务中的数据绑定完成的回滚关联

时间:2011-05-26 18:04:38

标签: grails transactions rollback grails-validation

给出以下两个域类:

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

1 个答案:

答案 0 :(得分:0)

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

您是否指定该服务是否为交易服务?您应该有一个如下所示的声明来声明该服务是事务性的。

def transactional = true