These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: LazyLoading and OneToMany relationships
PostPosted: Mon Jun 18, 2007 9:07 am 
Newbie

Joined: Wed Jun 13, 2007 5:44 am
Posts: 16
Hi,

I'm trying to do a Lazy Loading on a OneToMany relationship;

Basically, I have a Topic class, which has a relationship to itself (the classic parent/child link).
I searched a bit in the doc, and applied the suggested Annotations, but it doesn't work.
I'm using Jboss 4.0.5 and Seam 1.2.1.
Nothing too fancy about my code, but here is it though:

Code:
@Entity
@Scope(SESSION)
@Indexed //Hibernate search annoation
public class Topic implements Serializable, TreeNode/*rich:tree interface*/ {
...

   @OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)
   @LazyCollection(LazyCollectionOption.TRUE)
   @JoinTable(
            name="Topic_Topic",
            joinColumns = { @JoinColumn( name="parent_id") },
            inverseJoinColumns = @JoinColumn( name="child_id"))
   private Map<String,Topic> topics; //children of that Topic

        @ManyToOne
   private Topic parentTopic;

...
}


Here's the stack trace error whem I'm trying to load just the 'root' topic:

Code:
15:11:42,911 ERROR [LazyInitializationException] failed to lazily initialize a collection of role: com.lrb.Thesaurus.Topic.topics, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lrb.Thesaurus.Topic.topics, no session or session was closed
        at 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.PersistentMap.isEmpty(PersistentMap.java:121)
        at com.lrb.Thesaurus.Topic.isLeaf(Topic.java:363)
        at org.richfaces.component.TreeDataModel.isLeaf(TreeDataModel.java:209)
        at org.richfaces.component.CacheableTreeDataModel$Visitor.process(CacheableTreeDataModel.java:50)
        at org.richfaces.component.AbstractTreeDataModel.processElement(AbstractTreeDataModel.java:129)
        at org.richfaces.component.TreeDataModel.walk(TreeDataModel.java:74)
        at org.richfaces.component.TreeDataModel.walk(TreeDataModel.java:117)
        at org.richfaces.component.CacheableTreeDataModel.walk(CacheableTreeDataModel.java:105)
        at org.richfaces.component.UITree.walk(UITree.java:271)
        at org.richfaces.renderkit.TreeRendererBase.writeContent(TreeRendererBase.java:377)
        at org.richfaces.renderkit.TreeRendererBase.encodeChildren(TreeRendererBase.java:299)
        at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:524)
        at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:244)
        at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:249)
        at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:249)
        at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:573)
        at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
        at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:229)
        at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:63)
        at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:57)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:60)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:79)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.web.SeamFilter.doFilter(SeamFilter.java:84)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:96)
        at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:220)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
        at java.lang.Thread.run(Thread.java:619)
15:11:42,914 ERROR [STDERR] 18 juin 2007 15:11:42 com.sun.facelets.FaceletViewHandler handleRenderException
GRAVE: Error Rendering View[/topicList.xhtml]
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.lrb.Thesaurus.Topic.topics, no session or session was closed
        at 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.PersistentMap.isEmpty(PersistentMap.java:121)
        at com.lrb.Thesaurus.Topic.isLeaf(Topic.java:363)
        at org.richfaces.component.TreeDataModel.isLeaf(TreeDataModel.java:209)
        at org.richfaces.component.CacheableTreeDataModel$Visitor.process(CacheableTreeDataModel.java:50)
        at org.richfaces.component.AbstractTreeDataModel.processElement(AbstractTreeDataModel.java:129)
        at org.richfaces.component.TreeDataModel.walk(TreeDataModel.java:74)
        at org.richfaces.component.TreeDataModel.walk(TreeDataModel.java:117)
        at org.richfaces.component.CacheableTreeDataModel.walk(CacheableTreeDataModel.java:105)
        at org.richfaces.component.UITree.walk(UITree.java:271)
        at org.richfaces.renderkit.TreeRendererBase.writeContent(TreeRendererBase.java:377)
        at org.richfaces.renderkit.TreeRendererBase.encodeChildren(TreeRendererBase.java:299)
        at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:524)
        at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:244)
        at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:249)
        at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:249)
        at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:573)
        at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
        at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:229)
        at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:63)
        at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:57)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:60)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:79)
        at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
        at org.jboss.seam.web.SeamFilter.doFilter(SeamFilter.java:84)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:96)
        at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:220)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
        at java.lang.Thread.run(Thread.java:619)


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 18, 2007 11:18 am 
Regular
Regular

Joined: Wed May 05, 2004 8:01 am
Posts: 53
All hibernate managed collections are lazy by default (no need to specify that). Still you need to keep the session open (the one that loaded the root object) when accessing the children collection. Otherwise you will get an exception you pasted.

If for some reason the session is not open anymore you have to associate the root object with a new session before accessing lazy collections.

Please rate if that helps.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 19, 2007 9:36 am 
Newbie

Joined: Wed Jun 13, 2007 5:44 am
Posts: 16
If I understood well, that should be enough right?
Quote:
EntityManager em = (EntityManager) Component.getInstance("entityManager");
Session session = (Session) em.getDelegate();
session.merge(root);


But it's not.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 20, 2007 6:44 am 
Newbie

Joined: Wed Jun 13, 2007 5:44 am
Posts: 16
I still can't manage to Lazy load my 'topics' list.
I now know it's related to the fact my session isn't alive, but I have no idea how to recreate one so that the lazy loading works again.

I tryed to surround my code in a session transaction like in the Hibernate doc, but didn't seem to work.

Now, seam-wise, my switched my Bean to a Stateful bean with a @Begin annotion on the method which loads the data, but the application can't either lazy load the 'topics' when its needed.



Code:
@Begin(join=true)
   public String goTopicList(){
      try{
         if(rootTopics==null)
            rootTopics = em.createQuery("select t from Topic t where root=1").getResultList();
         System.out.println("Nb de root topics: "+rootTopics.size());

      }
      catch(Exception e){


      }
      return "topicList";

   }

Impossible to get the 'topics' property of the rootTopics further in my application, even though I'm in a conversation thanks to the @Begin, I got a Lazy Loading exception



[EDIT]
I solved the problem simlpy by putting the 'EXTENDED' type to my EntityManager in my Stateful bean.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.