Исключение "не удалось лениво инициализировать коллекцию ролей" возникает даже при использовании шаблона OSIV
Я использую OpenSessionInViewInterceptor, чтобы избежать LazyInitializationException.
Это работало нормально, но иногда возникает LazyInitializationException, даже если я использую OSIV. Исключения таковы:
SEVERE: Servlet.service() for servlet [appServlet] in context with path []
threw exception [Request processing failed; nested exception is
org.apache.tiles.impl.CannotRenderException: ServletException including path
'/WEB-INF/views/home/master.jsp'.] with root cause org.hibernate.LazyInitializationException:
failed to lazily initialize a collection of role: com...,
no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersisten
tCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(Abs
tractPersistentCollection.java:375)
at
Более странно то, что журнал исключений находится только в файлах журналов, и для навигации по сайту нет проблем.
Как это случилось?
2 ответа
В моем случае это было из-за кеширования объектов. Как кэшированные объекты были отделены LazyInitializationException
произошло при доступе к некоторым свойствам, которые не были инициализированы позже.
Обычно это происходит, когда вы работаете с отсоединенным объектом. Вы должны повторно присоединить объект к сеансу, чтобы Hibernate мог с ним работать.
использование session.merge()
или же session.refresh()
Здесь у вас также есть несколько примеров: Как правильно заново прикрепить отдельные объекты в Hibernate?