Подтвердить что ты не робот

SelectManyCheckbox LazyInitializationException при проверке процесса

Похоже, что если вы используете selectManyCheckbox, поддерживаемый набором, который проксируется спящим режимом, вы столкнетесь с проблемами с ужасным LazyInitializationException. Это не имеет никакого отношения к состоянию поддержки bean!

После отладки Mojarra 2.1 я обнаружил, что если вы не включили атрибут collectionType, он попытается клонировать класс базового значения на фазе проверки процесса, что в моем случае является PersistentSet. Конечно, добавление какой-либо ценности к этому приведет к исключению LazyInitializationException.

Мой вопрос: думаете ли вы, что это разумное поведение на фазе проверки процесса?

Лучшим алгоритмом клонирования класса коллекции будет просмотр интерфейса и создание экземпляра известного класса из java.util.

4b9b3361

Ответ 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>