Hibernate: отложенная загрузка не работает при отображении «один ко многим» на съемочной площадке - PullRequest
3 голосов
/ 23 апреля 2009

Я использую Spring вместе с Hibernate для разработки портлета для сервера портала Liferay. Теперь у меня есть две сущности, A и B, где A, возможно, содержит много B. Так что это идет к отображению один-ко-многим между двумя.

<set cascade="all" lazy="true" name="comments" order-by="creationDate desc">
   <key column="lfpn_pinboardentries_idPinboardEntry" not-null="true"/>
   <one-to-many class="Comment"/>
</set>

В соответствующем DAO объекта A на уровне DAO я наследую от "HibernateDaoSupport", предоставленного Spring, поэтому типичный поиск данных выглядит следующим образом:

...
public A getA(long id) {
  return (A) getHibernateTemplate().get(A.class, id);
}
...

Все работает нормально, если у меня "lazy = false", но как только я переключаюсь на "lazy = true", выдается следующая ошибка:

org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: com.lifepin.entities.PinboardEntry.comments, ни один сеанс или сеанс не был закрыт

У кого-нибудь есть предложение, в чем может быть проблема, или советы, как ее решить?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 23 апреля 2009

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

Проще говоря: сеанс Hibernate, в котором объект был изначально загружен, закрыт. При доступе к лениво загруженному свойству этого объекта в другом сеансе Hibernate возникает это исключение.

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

1 голос
/ 09 июня 2009

Хорошее обсуждение отложенной загрузки в спящем режиме и очень полезное решение (называемое Preload pattern) можно найти здесь: http://entwickler -forum.de / showthread.php? Т = 47067

К сожалению, это немецкий сайт. Но по крайней мере исходный код и его документ написаны на английском языке.

Основная идея веб-сайта, приведенного выше, состоит в том, чтобы дать возможность избежать загрузки всего графа объекта (посредством отложенной загрузки) и явно указать, какие части графа объекта следует загружать в данной ситуации.

0 голосов
/ 09 июня 2009

Некоторые люди используют OpenSessionInViewFilter, когда используют спящий режим с Spring Framework.

В нем говорится, что вы должны объявить фильтр в файле web.xml:

<filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Но это не решает мою проблему. Может я что-то не так делаю.

0 голосов
/ 15 мая 2009

Это связано с тем, что ваш сеанс Hibernate закрывается где-то в методе getHibernateTemplate. Если у вас есть lazy = "true", тогда можно установить связь между seesion.open () и session.close (). lazy = "false" работает, потому что Hibernate охотно выбирает связанные объекты B при загрузке A.

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