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。我们认为这是由于冬眠的脏检查造成的,这意味着现有
author
books
集合已更改并且将被保留,并且此保存将级联到书本实例。 在这种情况下,防止grails保存图书的最佳方法是什么?或为什么验证失败时不能正确回滚由数据绑定完成的关联?     

解决方法

如果您指定服务是事务性的,则任何未捕获的异常都将导致事务在服务方法内回滚。唯一可能妨碍您的事情就是您的RDBMS不支持真正的事务/回滚。 您是否指定了该服务是否是交易性的?您应该有如下声明来声明服务是可交易的。
def transactional = true
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...