Grails, сохранить класс домена после исключения - PullRequest
0 голосов
/ 19 сентября 2018

Использование grails 3.3.8

Любой файл domainclass.save (flush: true, failOnError: true) не сохраняется, если в методе службы, в котором выполняется сохранение, возникло исключение.т.е.

try {
    //some code that throws exception
} catch (Exception exception) {
    print 'some message'
}

domainclass.save(flush:true,failOnError:true)

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Что ж, до Grails 3.1 сервисы были транзакционными по умолчанию, а с Grails 3.1 они транзакционные, только если применяется аннотация @Transactional.

Если вы находитесь в транзакционной службе, когда срабатывает исключениетранзакция будет помечена для отката.В то же время при откате транзакции сеанс Hibernate, используемый GORM, очищается.

Я предполагаю, что ваш сервис помечен @Transactional.Вот почему ваш домен не сохраняется.Чтобы обойти описанное выше поведение, вы можете пометить свой сервис как @NotTransactional.Это даст вам больше контроля над вашим методом обслуживания, просто знайте, что он больше не будет транзакционным.И сеанс GORM не будет очищен после создания исключения.

РЕДАКТИРОВАТЬ: Поскольку вы звоните .save(), настоятельно рекомендуется сделать это внутри транзакции.Затем вы можете использовать метод withTransaction(Closure).

0 голосов
/ 24 сентября 2018

Я нашел способ обойти вышесказанное.Если вы извлечете свой блок try catch и поместите его в другой метод, класс сохранения домена будет сохранен.

т.е.

callMethodThatContainsTryCatch()
domainClass.save()

вместо

try {
} catch (Exception exception) {
    println "some exception"
}

domainClass.save()

ItЗатем появится сообщение, что любое исключение в вашем методе откатывает все транзакции gorm в этом методе.

...