gpt4 book ai didi

grails - 为什么Grails似乎正在保存无效的域对象?

转载 作者:行者123 更新时间:2023-12-02 16:00:51 25 4
gpt4 key购买 nike

我正在使用Grails 2.4.2。我正在保存违反约束的域类的实例,因此我希望保存会失败。但它似乎成功了。 Grails文档指出:

Another thing to bear in mind is that Grails validates a domain instance every time you save it. If that validation fails the domain instance will not be persisted to the database.



域类:
class Book {
String name
static constraints = {
name unique: true
}
String toString() { "[Book: id=${id} name=${name}]" }
}

以下代码修改了第二个实例,使其与第一个实例具有相同的名称,并尝试保存它(book3.save)。我希望这会失败,并且确实会返回null。但是随后我通过ID(Book.get(book2.id))加载了同一对象,并发现它具有新名称。最后,它会打印整个书籍 list ,我们看到它们都具有相同的名称。
    def book1 = new Book(name: "Cats").save()
def book2 = new Book(name: "Dogs").save()
log.info "The books: ${Book.list()}"
def book3 = Book.get(book2.id)
book3.name = "Cats"
def book3save = book3.save() // Should fail?
def book4 = Book.get(book2.id)
log.info "The result of saving book ${book2.id} with name 'Cats' is ${book3save}"
log.info "The book with ID ${book2.id} is now named ${book4.name}"
log.info "The books are: ${Book.list()}"

输出:
The books: [[Book: id=1 name=Cats], [Book: id=2 name=Dogs]]
The result of saving book 2 with name 'Cats' is null
The book with ID 2 is now named Cats
The books are: [[Book: id=1 name=Cats], [Book: id=2 name=Cats]]

最佳答案

默认情况下,Grails不会在验证错误上引发异常。你可以做

book3.save(failOnError: true)

这将引发异常。

或者您需要检查save()的返回值。 null表示验证失败。您也可以执行book3.validate()来查看实例是否有效,然后再尝试保存。

我认为您在正在更新的书的外观中看到的是由于休眠 session 。保存失败,但是对Book.get()的调用从当前的休眠 session 而不是数据库中加载实例。如果您检查了脏标志,则可以确认此检查isDirty()或调用refresh()从数据库中重新获取实例。

关于grails - 为什么Grails似乎正在保存无效的域对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31084065/

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