jpa - JSF + Hyperjaxb3 + Hibernate LazyInitializationException accross requests -
i have jsf application trinidad components , jaxb/jpa entity beans generated hyperjaxb3. in ui use trinidad combo box component has jpa object values.
the scenario is:
- user make selection in combo box
- user clicks on control sends request server , returned same form
- data form submitted , selection in combo box should user did in step 1. equals() method called on combo box items (jpa objects) , exception thrown:
org.hibernate.lazyinitializationexception: failed lazily initialize collection of role: package.anobject.items, no session or session closed @ org.hibernate.collection.abstractpersistentcollection.throwlazyinitializationexception(abstractpersistentcollection.java:358) @ org.hibernate.collection.abstractpersistentcollection.throwlazyinitializationexceptionifnotconnected(abstractpersistentcollection.java:350)
@ org.hibernate.collection.abstractpersistentcollection.readsize(abstractpersistentcollection.java:97) @ org.hibernate.collection.persistentbag.size(persistentbag.java:225) @ org.jvnet.hyperjaxb3.item.abstractitemlist.size(abstractitemlist.java:51) @ java.util.abstractlist$itr.hasnext(unknown source) @ org.jvnet.jaxb2_commons.lang.builder.jaxbequalsbuilder.append(jaxbequalsbuilder.java:57) @ org.jvnet.jaxb2_commons.lang.builder.jaxbequalsbuilder.append(jaxbequalsbuilder.java:29) @ package.anobject.equals(anobject.java:177) @ org.jvnet.jaxb2_commons.lang.builder.jaxbequalsbuilder.append(jaxbequalsbuilder.java:34) @ package.parentobject.equals(parentobject.java:532) @ package.parentobject.equals(parentobject.java:551) @ java.util.arraylist.indexof(unknown source) @ org.apache.myfaces.trinidad.component.uixselectmany._destructivecompareoutoforderlists(uixselectmany.java:179) @ org.apache.myfaces.trinidad.component.uixselectmany.comparevalues(uixselectmany.java:139) @ org.apache.myfaces.trinidad.component.uixeditablevalue.validate(uixeditablevalue.java:180) @ org.apache.myfaces.trinidad.component.uixeditablevalue._executevalidate(uixeditablevalue.java:503) @ org.apache.myfaces.trinidad.component.uixeditablevalue.processvalidators(uixeditablevalue.java:270) @ javax.faces.component.uicomponentbase.processvalidators(uicomponentbase.java:1058) @ javax.faces.component.uicomponentbase.processvalidators(uicomponentbase.java:1058)
i use openentitymanagerinviewfilter spring lazy loaded objects - works in 1 request.
on level of hyperjaxb generated object equals()
method calls equals(object object, equalsbuilder equalsbuilder)
method equalsbuilder.append(...)
called on each attribute of object. when attribute list proxied persistenbag , point lazyinitializationexception.
equals()
method - generated 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)
generated 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 thrown here equalsbuilder.append(this.getanobject(), that.getanobject()); equalsbuilder.append(this.get..., that.get...); ... }
do guys have ideas how fix problem?
i tried use jsf converter , have selectitem string value (not object) if remember right equals() called after string converted object.
you because objects not detached (1) , access data (2) outside session (3). correct, should address (1-3) in combination.
- detach objects. easiest, it's no lazy loading.
- make sure session available. you're using oemiv pattern - how comes session isn't there when equals method called? believe it's because equals called not during view rendering in other jsf phases. can try extend oemiv pattern make span on whole jsf lifecycle.
- don't access data. equals(...) , hashcode(...) methods recommended, not required. can disable generation in hj3, can exclude properties hashcode()/equals(...) building, can use own equals , hashcode strategies - plenty of ways achieve this.
me personally, i'd check first, why session not there.
Comments
Post a Comment