[jboss-jira] [JBoss JIRA] Commented: (JBAS-5474) @PostLoad -> LazyInitializationException: illegal access to loading collection ond a @OneToMany with FetchType.EAGER

arjan tijms (JIRA) jira-events at lists.jboss.org
Fri Apr 16 07:41:28 EDT 2010


    [ https://jira.jboss.org/jira/browse/JBAS-5474?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12526158#action_12526158 ] 

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 at 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

        


More information about the jboss-jira mailing list