Весна и спячка, Ленивая проблема инициации - PullRequest
3 голосов
/ 08 января 2009

Эй, я разрабатываю настольное приложение, используя Spring и Hibernate, и у меня проблема с отложенной инициализацией. Я посмотрел в Интернете, и каждое решение связано с открытым сеансом в шаблоне представления, но я не могу использовать этот шаблон. Я также пытался получить sessionfactory от HibernateTemplate, но он возвращает мне отключенный сеанс.

Кто-нибудь знает другое решение?

Ответы [ 3 ]

4 голосов
/ 09 января 2009

Я бы предположил, что у вас есть два решения:

  1. Примите меры к тому, чтобы сеанс Hibernate был открыт при доступе к объекту или коллекции с отложенной инициализацией. Это означает, что вам нужно будет тщательно пометить границы транзакций в своем коде, а именно шаблон «открыть сеанс в представлении». Spring делает это возможным, но в настольном приложении это будет не так просто, как в веб-приложении, где границы транзакций немного более очевидны.

  2. Отключите все ленивые инициализации для ваших постоянных объектов в Hibernate.

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

Надеюсь, это поможет!

1 голос
/ 10 декабря 2010

У меня была очень похожая проблема, и, поскольку я не смог найти действительно подходящего решения. Я придумал свой собственный, объединяющий множество различных подходов, найденных в сети, и разместил их в своем блоге.

Извините, что я не помещаю это все здесь, но это много работы, чтобы делать это снова и снова на всех форумах, я нашел людей, имеющих эту или подобную проблему

Удаленная отложенная загрузка с помощью Hibernate и Spring

1 голос
/ 10 января 2009

Один из вариантов - вызвать Hibernate.initialize () для сущностей или коллекций, чтобы принудительно инициализировать их. Вы хотели бы сделать это, прежде чем вернуть данные обратно на просмотр. Я бы тщательно обдумал это, поскольку он будет генерировать множество SQL-операторов обратно в базу данных.

Возможно, вы захотите изучить использование «fetch» ​​в ваших HQL-запросах или настроить режим извлечения «eager» в ваших отображениях (я считаю, что это FetchMode.EAGER в JPA или lazy = «false» в hbm.xml).

@ Хосе: Не управляйте сессией в своем собственном ThreadLocal. Используйте SessionFactory.getCurrentSession () и настройте Hibernate для использования «потока» SessionContext.

...