gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:55:30 25 4
gpt4 key购买 nike

给定以下两个域类:

class Book {
String title

static hasMany = [authors: Author]
static belongsTo = Author
static constraints = {
title(nullable: false)
}
}

class Author {
static hasMany = [books: Books]
}

我们在服务中创建和持久化领域对象,并利用 Grails 的数据绑定(bind)特性。这种方法如下所示:
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 map
params = ["authors": "[2]"]

到服务方法(没有定义标题,因此验证将失败)从新创建的书到已经存在的作者(反之亦然)的关联是通过数据绑定(bind)完成的。但是由于标题是 nullable: false并且未定义 ValidationException被抛出并且事务被回滚。

我们现在的预期是这本书没有被保存,而是 Book.list().isEmpty()返回假。我们认为这是由于 hibernate 的脏检查,这意味着 books现有 author 的集合已更改并将持久保存,并且此保存将级联到书籍实例。

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

最佳答案

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

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

def transactional = true

关于Grails:通过服务中的数据绑定(bind)完成的回滚关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com