Grails: проблема при вызове метода службы из другого метода службы - PullRequest
1 голос
/ 23 февраля 2011

У меня есть 2 метода в одном классе обслуживания:

boolean meth1(DomClass dom1) { //parameter is an instance of domain class DomClass
    ...
    meth2(dom1)
    ...
    dom1.delete(flush: true)
    ... 
    return true
}

boolean meth2(DomClass dom1) {
   ...
   dom1.changeSomeProperty
   dom1.save(flush:true)
   return true
}

Проблема заключается в том, что на линии, вызывающей dom1.delete(flush: true), происходит сбой программы с deleted object would be re-saved by cascade (remove deleted object from associations).

Теперь я не очень хорошо знаю Hibernate, но я предполагаю, что любой из этих методов создает новую транзакцию, а meta1 имеет первую транзакцию, а meth2 - вторую. И действительно, если я удаляю dom1.save, все работает хорошо.

Теперь мой вопрос: я могу сделать, чтобы meth1 содержал весь код от meth2, но это будет означать, что я много дублирую код (в моем реальном примере я хочу использовать некоторую логику во многих местах). Как я могу повторно использовать код в одном методе, заставив все методы стека служб выполняться в одной транзакции (если это действительно проблема, иначе: «в чем проблема?»)

1 Ответ

1 голос
/ 23 февраля 2011

эта ошибка возникает, когда на экземпляр ClassA ссылается экземпляр ClassB, а настройки каскада B приводят к сохранению экземпляров A, и вы удаляете экземпляр A. Исправление простое, делать именно то, чтоисключение говорит и удаляет classA из любого класса домена, на который он ссылается.

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

Причина, по которой удаление вызова save делает код работоспособным, заключается в том, что без сохранения вывероятно, не сохраняют другой экземпляр, который обращается к dom1 и вызывает ошибку для начала.Без сохранения этого экземпляра нет каскада.

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

...