подключите объект в области управления запросами - PullRequest
0 голосов
/ 18 марта 2011

У меня есть веб-приложение, в котором пользователь делает выбор, а справа внизу, используя ajax, должны отобразиться детали выбора. Например, пользователь выбирает человека в верхней части, а в нижней - все данные о человеке. есть куча коллекций лично, которые лениво загружены. Когда вызывается любая коллекция, я получаю исключение lazyinitialization, которое ожидается. как мне этого избежать. Как мне присоединить объекты к entityManager после вызова ajax.

Ответы [ 3 ]

1 голос
/ 19 марта 2011

LazyInitializationException возникает при попытке получить коллекцию от объекта, который уже отсоединен от сеанса.

Для этого вам необходимо заново присоединить объект, т. Е. Сделать его управляемым. Сначала проверяется, связаны ли объекты с сеансом или нет.

contains(Object object) : Check if this instance is associated with this Session.

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

refresh(Object object) : Re-read the state of the given instance from the underlying database.
1 голос
/ 18 марта 2011

Есть несколько способов сделать то, что вы делаете здесь:

  1. Используйте энергичную загрузку для всех коллекций в сущности Person, но это может негативно сказаться на производительности.
  2. Если вы используете JPA 2.0, самый простой способ - использовать перехватчик OpenEntityManagerInView. Затем вы можете использовать JSON Jackson для полной json-ify сущности Person и возврата JSON в представление.
  3. Если опция № 1 и опция № 2 неосуществимы, вы должны попытаться загрузить фактические объекты коллекции, а не прокси для них. Что нужно сделать, так это то, что для каждой из коллекций (скажем, коллекции A) вызовите A.get (0) .someGetter () до закрытия сеанса / транзакции. Это загрузит фактические экземпляры объектов в коллекции A. должно быть сделано для каждой из коллекций. У вас может быть определенный метод для этого в определенных случаях, например, в этом случае.
  4. Преобразуйте полную сущность Person в объект другого типа, например JSON (как вы используете здесь ajax), перед тем как сеанс / транзакция будет закрыта. Для этого переберите все объекты во всех коллекциях, заполните их в виде объекта JSON и верните то же самое.
0 голосов
/ 23 марта 2011

Я пошел с решением, представленным в этой статье.

http://9mmedia.com/blog/?p=272

Спасибо, что нашли время ответить.

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