Имеются следующие два класса домена:
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
map
params = ["authors": "[2]"]
методу службы (заголовок не определен, поэтому проверка не будет выполнена)ассоциация из вновь созданной книги с уже существующим автором (и наоборот) осуществляется с помощью привязки данных.Но поскольку заголовок nullable: false
и не определен, генерируется ValidationException
и транзакция откатывается.
Теперь мы ожидали, что книга не будет сохранена, но Book.list().isEmpty()
вернет false.Мы думаем, что это из-за грязной проверки hibernate, то есть коллекция books
существующего author
изменилась и будет сохранена, и это сохранение будет каскадно добавлено к экземпляру книги.
Что такоелучший способ предотвратить сохранение книги в этом сценарии?Или почему связывание, выполненное связыванием данных, не откатывается должным образом, когда проверка не проходит?