Чтение объектов из базы данных после отката метода сервиса - PullRequest
2 голосов
/ 20 июля 2010

У меня есть служба grails, в которой сохраняются некоторые изменения. Если я выполняю откат транзакции в классе обслуживания, выбрасываю RuntimeException и позже (в том же запросе) пытаюсь перечитать любые данные, я получаю следующее исключение:

ERROR hibernate.LazyInitializationException  - failed to lazily initialize a collection of role: <my related class> no session or session was closed

Итак, дело в следующем:

Я пытаюсь обновить объект в классе обслуживания, и если он не удастся, я сделаю откат транзакции. В контроллере позаботьтесь об исключении, и я верну XML неисправного объекта. Для создания XML-грааля пытается прочитать все связанные объекты -lazy load 1-n Relationship (это то, что я хочу), но, поскольку мы уже сделали откат в классе обслуживания, у меня нет сеанса, и он завершается неудачно. Я пытался использовать .withNewSession {}, и он не работает.

Есть идеи или обходной путь?

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Прежде всего, вы вручную обрабатываете транзакции (это звучит так из вашего поста)?Grails сделает это за вас, если вы сделаете сервис транзакционным.Я бы рекомендовал не пытаться управлять tx самостоятельно, если это действительно то, что вы делаете.Такие вещи сложны и подвержены ошибкам, и если Grails делает это для вас, зачем вам это делать с самим собой?

Во-вторых, в случае ошибки вы пытаетесь получить доступ к даннымзагружен.Так как ваша сессия ушла, когда TX откатился назад, вы не можете этого сделать.Я бы изменил ваше сообщение об ошибке, чтобы не полагаться на какие-либо данные в сеансе, если это возможно.т.е. не пытайтесь xml-ify объект.

Хотя, я не уверен, почему withNewSession не работает ... Можем ли мы увидеть какой-то код?

1 голос
/ 20 июля 2010

Кажется, что у вас есть Отдельный объект , поэтому попробуйте использовать метод merge ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...