我有 JSF 应用程序,其中包含由 Hyperjaxb3 生成的 trinidad 组件和 JAXB/JPA 实体 bean。在 UI 中,我使用具有 JPA 对象作为值的 Trinidad 组合框组件。
场景是:
- 用户在组合框中进行选择
- 用户单击向服务器发送请求并返回相同表单的控件
- 表单中的数据已提交,组合框中的选择应与用户在步骤 1 中所做的一样。对组合框项(JPA 对象)调用 equals() 方法并引发此异常:
org.hibernate.LazyInitializationException:未能延迟初始化角色集合:package.AnObject.items,在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358) 处没有关闭会话或会话在 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)
我使用 Spring 中的 OpenEntityManagerInViewFilter 来获取延迟加载的对象——在一个请求中工作。
在 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 转换为我的对象之后调用了正确的 equals()。