Grails: ассоциации отката, сделанные привязкой данных в сервисе - PullRequest
1 голос
/ 26 мая 2011

Имеются следующие два класса домена:

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 изменилась и будет сохранена, и это сохранение будет каскадно добавлено к экземпляру книги.

Что такоелучший способ предотвратить сохранение книги в этом сценарии?Или почему связывание, выполненное связыванием данных, не откатывается должным образом, когда проверка не проходит?

1 Ответ

0 голосов
/ 27 мая 2011

Если вы указали, что ваша служба является транзакционной, любое необработанное исключение вызовет откат транзакции в рамках метода службы. Единственное, что может вам помешать, - это если ваша СУБД не поддерживает истинные транзакции / откат.

Вы указали, является ли услуга транзакционной? У вас должно быть заявление, подобное приведенному ниже, чтобы объявить, что услуга является транзакционной.

def transactional = true
...