У меня есть приложение JSF с компонентами тринидада и объектными компонентами JAXB / JPA, сгенерированными Hyperjaxb3. В пользовательском интерфейсе я использую компонент комбинированного поля Trinidad, в котором в качестве значений используется объект JPA.
Сценарий:
- Пользователь делает выбор в поле со списком
- Пользователь нажимает на элемент управления, который отправляет запрос на сервер и возвращается в ту же форму
- Данные из формы были отправлены, и выбор в поле со списком должен быть таким же, как пользователь на шаге 1. Метод equals () вызывается для элементов поля со списком (объекты JPA), и выдается это исключение:
org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: package.AnObject.items, ни один сеанс или сеанс не был закрыт
в org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
at org.hibernate.collection.PersistentBag.size(PersistentBag.java:225)
at org.jvnet.hyperjaxb3.item.AbstractItemList.size(AbstractItemList.java:51)
at java.util.AbstractList$Itr.hasNext(Unknown Source)
at org.jvnet.jaxb2_commons.lang.builder.JAXBEqualsBuilder.append(JAXBEqualsBuilder.java:57)
at org.jvnet.jaxb2_commons.lang.builder.JAXBEqualsBuilder.append(JAXBEqualsBuilder.java:29)
at package.AnObject.equals(AnObject.java:177)
at org.jvnet.jaxb2_commons.lang.builder.JAXBEqualsBuilder.append(JAXBEqualsBuilder.java:34)
at package.ParentObject.equals(ParentObject.java:532)
at package.ParentObject.equals(ParentObject.java:551)
at java.util.ArrayList.indexOf(Unknown Source)
at org.apache.myfaces.trinidad.component.UIXSelectMany._destructiveCompareOutOfOrderLists(UIXSelectMany.java:179)
at org.apache.myfaces.trinidad.component.UIXSelectMany.compareValues(UIXSelectMany.java:139)
at org.apache.myfaces.trinidad.component.UIXEditableValue.validate(UIXEditableValue.java:180)
at org.apache.myfaces.trinidad.component.UIXEditableValue._executeValidate(UIXEditableValue.java:503)
at org.apache.myfaces.trinidad.component.UIXEditableValue.processValidators(UIXEditableValue.java:270)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058)
Я использую OpenEntityManagerInViewFilter из Spring для получения отложенных загруженных объектов - это работает в одном запросе.
На уровне сгенерированного объекта HyperJAXB equals()
метод вызывает equals(Object object, EqualsBuilder equalsBuilder)
метод, где equalsBuilder.append(...)
вызывается для каждого атрибута этого объекта. Когда этот атрибут является списком, он передается через PersistenBag, и именно в этот момент я получаю исключение LazyInitializationException.
equals()
метод - генерируется HyperJaxb:
public boolean equals(Object object) {
if (!(object instanceof ParentObject)) {
return false;
}
if (this == object) {
return true;
}
final EqualsBuilder equalsBuilder = new JAXBEqualsBuilder();
equals(object, equalsBuilder);
return equalsBuilder.isEquals();
}
equals(Object object, EqualsBuilder equalsBuilder)
, сгенерированный HyperJaxb:
public void equals(Object object, EqualsBuilder equalsBuilder) {
if (!(object instanceof ParentObject)) {
equalsBuilder.appendSuper(false);
return ;
}
if (this == object) {
return ;
}
final ParentObjectthat = ((ParentObject) object);
// PersitentBag, LazyInitializationException is thrown here
equalsBuilder.append(this.getAnObject(), that.getAnObject());
equalsBuilder.append(this.get..., that.get...);
...
}
У вас, ребята, есть идеи, как решить эту проблему?
Я пытался использовать JSF-конвертер и выбрал SelectItem со значением String (не объектом), но, если я помню, вызывается метод right equals () после преобразования String в мой объект.