SelectManyCheckbox LazyInitializationException при проверке процесса
Похоже, что если вы используете selectManyCheckbox, поддерживаемый набором, который проксируется спящим режимом, вы столкнетесь с проблемами с ужасным LazyInitializationException. Это не имеет никакого отношения к состоянию поддержки bean!
После отладки Mojarra 2.1 я обнаружил, что если вы не включили атрибут collectionType, он попытается клонировать класс базового значения на фазе проверки процесса, что в моем случае является PersistentSet. Конечно, добавление какой-либо ценности к этому приведет к исключению LazyInitializationException.
Мой вопрос: думаете ли вы, что это разумное поведение на фазе проверки процесса?
Лучшим алгоритмом клонирования класса коллекции будет просмотр интерфейса и создание экземпляра известного класса из java.util.
Ответы
Ответ 1
Вот точно! Он не имеет ничего общего с состоянием сеанса...
Я столкнулся с этой проблемой, и я смог ее решить, добавив следующее в мой компонент (в моем случае selectManyMenu):
<f:attribute name="collectionType" value="java.util.ArrayList" />;
Ответ 2
Спасибо за подсказку использовать атрибут collectionType для h: selectMany tags, чтобы исключить LazyInitializationException.
Однако, вместо того, чтобы пылать об этом на неприемлемом форуме, как узнать, что нового в JSF 2.0, и опубликовать полный пример этой проблемы и как ее исправить?
Groundwork:
- Mojarra 2.1 является реализацией JSF 2 Reference (см. Что такое Mojarra).
- h: selectManyCheckbox VLD описывает, как использовать атрибут collectionType (новый в JSF 2.0)
- эта проблема влияет на проверку h: selectManyCheckbox, h: selectManyListBox и h: selectManyMenu теги
Stack Trace этой ошибки:
04 февраля 2013 г. 1:20:50 com.sun.faces.lifecycle.ProcessValidationsPhase execute ВНИМАНИЕ: не удалось лениво инициализировать коллекцию, сеанс или сеанс не были закрыты org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию, сеанс или сеанс не были закрыты at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122) at org.hibernate.collection.PersistentBag.isEmpty(PersistentBag.java:255) в javax.faces.component.UIInput.isEmpty(UIInput.java:1257) в javax.faces.component.UIInput.validateValue(UIInput.java:1144) в javax.faces.component.UISelectMany.validateValue(UISelectMany.java:579)
Пример добавления collectionType для исправления этой ошибки (я использую настраиваемый валидатор):
<h:selectManyListbox value="${technologyService.entity.associatedLabs}"
collectionType="java.util.ArrayList">
<f:validator validatorId="selectManyListboxValidator" />
<f:attribute name="maxItems" value="5" />
<f:selectItems value="${metadataService.activeLabSelectItems}" />
</h:selectManyListbox>