[
https://jira.jboss.org/jira/browse/JBAS-5474?page=com.atlassian.jira.plug...
]
arjan tijms commented on JBAS-5474:
-----------------------------------
After a tiny bit of digging, I found the following:
In org.hibernate.loader.Loader.initializeEntitiesAndCollections(), the following code is
executed
if ( hydratedObjects!=null ) {
int hydratedObjectsSize = hydratedObjects.size();
if ( log.isTraceEnabled() ) {
log.trace( "total objects hydrated: " + hydratedObjectsSize );
}
for ( int i = 0; i < hydratedObjectsSize; i++ ) {
TwoPhaseLoad.initializeEntity( hydratedObjects.get(i), readOnly, session, pre, post );
}
}
if ( collectionPersisters != null ) {
for ( int i=0; i<collectionPersisters.length; i++ ) {
if ( !collectionPersisters[i].isArray() ) {
//for sets, we should end the collection load after resolving
//the entities, since we might call hashCode() on the elements
//TODO: or we could do this polymorphically, and have two
// different operations implemented differently for arrays
endCollectionLoad( resultSetId, session, collectionPersisters[i] );
}
}
}
The call to the @PostBack method starts here:
TwoPhaseLoad.initializeEntity()
PostLoadEventListener[] listeners = session.getListeners().getPostLoadEventListeners();
for ( int i = 0; i < listeners.length; i++ ) {
listeners[i].onPostLoad(postLoadEvent);
}
From the first code fragment it becomes clear that
TwoPhaseLoad.initializeEntity(), which thus calls endCollectionLoad(), is called before
endCollectionLoad(). Shouldn't the onPostLoad() calls not move to some place after
endCollectionLoad()?
@PostLoad -> LazyInitializationException: illegal access to
loading collection ond a @OneToMany with FetchType.EAGER
--------------------------------------------------------------------------------------------------------------------
Key: JBAS-5474
URL:
https://jira.jboss.org/jira/browse/JBAS-5474
Project: JBoss Application Server
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: EJB3
Affects Versions: JBossAS-4.2.2.GA
Environment: Win XP SP2, Java 1.5.0_15-b04
Reporter: Stefan Lindner
Assignee: Emmanuel Bernard
Attachments: Child.java, Parent.java, PostLoadTest.java
I have a bean with a @OneToMany relation mapping like
private List<TherapieeinheitBean> therapieeinheiten;
@OneToMany(
cascade = {CascadeType.REFRESH},
fetch = FetchType.EAGER,
mappedBy="therapiekatalog"
)
with FetchType.EAGER and a simnple @PostLoad like
@PostLoad
public void postLoad() {
System.out.println("!!!!!!!!!! postLoad !!!!!!!!!!");
System.out.print("size: " + therapieeinheiten.size());
}
When an entity of this bean is loaded JBoss trows
org.hibernate.LazyInitializationException: illegal access to loading collection
at
org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341)
at
org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249)
at
de.visiodesk.therapiekatalog.TherapiekatalogBean.postLoad(TherapiekatalogBean.java:170)
.
.
.
and prints the messages
WARN [LoadContexts] fail-safe cleanup (collections) :
org.hibernate.engine.loading.CollectionLoadContext@2c8ce9<rs=Ingres-ResultSet[18523]>
WARN [CollectionLoadContext] On CollectionLoadContext#cleanup,
localLoadingCollectionKeys contained [206] entries
afterwards. The PostLoad method should be called after the data was completely loaded. Is
there a workaround for this Problem? I found some other ressources on the net where peole
had the same problem, but I saw no resolution, no hint, no workaround.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira