Бой LazyInitializationException без весны - PullRequest
0 голосов
/ 18 сентября 2011

Я использую Hibernate и у меня проблема с LazyInitializationException в моем приложении.Эта проблема может быть просто решена средой Spring (некоторые аннотации, конфиг или что-то в этом роде), но я просто не знаю эту среду и не хочу изучать ее сейчас (я только начинающий).

Эта проблема довольностарый, и поэтому я нашел, как это можно решить с помощью шаблона OpenSessioninView , но держу пари, есть более простой способ сделать это.

Мое приложение работает на последнем сервере приложений Glassfish, поэтому я хочузнать what the typical way to work with lazy initialization in EJB container?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2011

это ваша проблема:

"но я просто не знаю эту структуру и не хочу изучать ее сейчас (я только начинающий)."

Было бы хорошо, если бы все происходило автоматически, и нам даже не нужно было писать код, но, увы, не всегда все хорошо. Не имеет никакого смысла использовать технологию, но не хочется прилагать усилия / учиться использовать ее механизмы.

Есть несколько вариантов.

1) Открыть сеанс в поле зрения. Потратьте время, чтобы сделать это. Это не трудно. Что он делает, так это держит сеанс открытым в течение всего срока действия запроса, поэтому , если вы используете ленивые отношения, сеанс существует и данные могут быть загружены. @ Danny.lesnik неверный ответ - из того, что я прочитал, он подразумевает, что OSiV просто вызывает ассоциации, а это не то, что она делает. Если вы не хотите использовать Spring, вы можете найти пример реализации шаблона OSiV вручную, он не должен быть слишком плохим и, вероятно, хорошим опытом обучения.

2) Напишите пользовательские сопоставления / hql, чтобы загрузить все данные, необходимые для данного сценария. Это не значит загрузить все объекты; Вы можете загрузить определенные поля из таблиц, чтобы сделать выборку максимально возможной. Например, вы можете сделать ваши отображения / аннотации hibernate / jpa ленивыми, а затем написать собственный метод DAO, который выбирает только определенные поля из столбцов между таблицами в объединении. Это может быть очень быстро с некоторыми настройками / кешами / индексами.

Из обоих вариантов 1 проще, вам просто нужно посмотреть документацию, в основном ее конфигурацию. Обратите внимание, что у OSiV есть свои сложности, например, если вы изменяете данные, но есть исключение, представляющее результаты пользователю, и ваши транзакции настраиваются определенным образом, ваша модификация будет откатываться. Преимущество варианта 2 заключается в том, что он не нуждается в OSiV со всеми вытекающими отсюда сложностями, а также дает вам больший контроль над вашим взаимодействием с базой данных и компромисс с необходимостью выполнять больше работы.

0 голосов
/ 18 сентября 2011

Вы можете установить все как EAGER и использовать session.get вместо session.load, но держу пари, что открытый сеанс в поле зрения - лучший подход.

Кстати, именно это и делает SPring. Вы можете увидеть реализацию Spring OpenSessionInView здесь:

http://static.springsource.org/spring/docs/3.0.6.RELEASE/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html

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