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



给定以下两个域类:

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进行了脏检查,这意味着现有authorbooks集合已经更改并将被持久化,并且此保存将级联到book实例。

在这种情况下,防止grails保存图书的最佳方法是什么?或者,当验证失败时,为什么数据绑定完成的关联没有正确回滚?

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

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

def transactional = true

相关内容

  • 没有找到相关文章

最新更新