-->
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.  [ 10 posts ] 
Author Message
 Post subject: Lazy initialistation + Web application
PostPosted: Sun Jun 13, 2004 9:29 am 
Newbie

Joined: Wed Feb 11, 2004 12:03 pm
Posts: 15
Does someone know how to make sure the hibernate session will not last before my web page lazy initialize a set of object please ?
Actually I use a filter with a threadlocal like it is said in the hibernate reference documentation but it doesn't work...
Here is the code of my filter :

Code:
package utils;
import java.io.*;
import javax.servlet.*;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.cfg.Configuration;

public class SessionManager implements Filter
{
    protected static ThreadLocal hibernateHolder = new ThreadLocal();
    protected static ThreadLocal txHolder = new ThreadLocal();
    protected static SessionFactory factory;
   
     public void init(FilterConfig filterConfig) throws ServletException
     {
        // Initialize hibernate
        try
        {
            factory = new Configuration().configure().buildSessionFactory();
        }
        catch (HibernateException ex) { throw new ServletException(ex); }
     }
     
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                   throws IOException, ServletException
    {
        if (hibernateHolder.get() != null)
            throw new IllegalStateException(
                "A session is already associated with this thread!  "
                + "Someone must have called getSession() outside of the context "
                + "of a servlet request.");
           
        try
        {
            chain.doFilter(request, response);
        }
        finally
        {
            Session sess = (Session)hibernateHolder.get();
            Transaction tx = (Transaction)txHolder.get();
            if (sess != null)
            {
                hibernateHolder.set(null);
               
                try
                {
                    if (tx != null) {
                        tx.commit();
                    }
                    sess.close();
                }
                catch (HibernateException ex) { throw new ServletException(ex); }
            }
        }
    }
   
    public static Session getSession() throws HibernateException
    {
       //System.out.println("Getting session\n");
       Session sess = (Session)hibernateHolder.get();
       //System.out.println("Getting transaction\n");
        Transaction tx = (Transaction)txHolder.get();
               
        if (sess == null)
        {
           //System.out.println("Session doesn't exist, creating\n");
            sess = factory.openSession();
            //System.out.println("Session created\n");
            txHolder.set(sess.beginTransaction());
            //System.out.println("Session started\n");
            hibernateHolder.set(sess);
            //System.out.println("Session allocated\n");
        }
        else {
              if (tx == null) {
              throw new IllegalStateException("Transaction was allready rolled back");
             }
        }
        //System.out.println("Session successfully retrieved\n");
        return sess;
    }
   
    public static void rollback() throws HibernateException {
        Transaction tx = (Transaction)txHolder.get();
        if (tx == null) {
            throw new IllegalStateException("Transaction was allready rolled back");
        }
       
        tx.rollback();
        txHolder.set(null);
    }
               
    public void destroy() {
        try {
            factory.close();
        }
        catch (HibernateException ex) { throw new RuntimeException(ex); }
    }       
}


the code of my webpage is just a standard one with an iterator wich try to enumerate objects from a set of my current persisted object.

the error i get is :

Code:
ERROR - Failed to lazily initialize a collection - no session or session was closed
net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a collection - no session or session was closed
   at net.sf.hibernate.collection.PersistentCollection.initialize(PersistentCollection.java:209)
   at net.sf.hibernate.collection.PersistentCollection.read(PersistentCollection.java:71)
   at net.sf.hibernate.collection.Set.iterator(Set.java:130)
   at com.opensymphony.webwork.util.MakeIterator.convert(MakeIterator.java:60)
   at com.opensymphony.webwork.views.jsp.IteratorTag.doStartTag(IteratorTag.java:140)
   at org.apache.jsp.jsp.showdataset_jsp._jspx_meth_ww_iterator_0(showdataset_jsp.java:316)
   at org.apache.jsp.jsp.showdataset_jsp._jspx_meth_ww_push_0(showdataset_jsp.java:177)
   at org.apache.jsp.jsp.showdataset_jsp._jspx_meth_ww_form_0(showdataset_jsp.java:114)
   at org.apache.jsp.jsp.showdataset_jsp._jspService(showdataset_jsp.java:69)
   at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
   at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:298)
   at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
   at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
   at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:703)
   at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
   at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
   at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
   at com.opensymphony.webwork.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:64)
   at com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute(WebWorkResultSupport.java:53)
   at com.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:274)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:192)
   at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:170)
   at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:170)
   at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:170)
   at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116)
   at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:182)
   at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:162)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
   at utils.SessionManager.doFilter(SessionManager.java:39)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
   at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
   at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
   at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
   at java.lang.Thread.run(Unknown Source)
ERROR - Could not execute action
org.apache.jasper.JasperException: Failed to lazily initialize a collection - no session or session was closed
   at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:346)
   at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
   at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
   at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:703)
   at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
   at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
   at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
   at com.opensymphony.webwork.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:64)
   at com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute(WebWorkResultSupport.java:53)
   at com.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:274)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:192)
   at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:170)
   at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:170)
   at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
   at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:170)
   at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116)
   at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:182)
   at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:162)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
   at utils.SessionManager.doFilter(SessionManager.java:39)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
   at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
   at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
   at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
   at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
   at java.lang.Thread.run(Unknown Source)


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 14, 2004 6:04 am 
Newbie

Joined: Wed Feb 11, 2004 12:03 pm
Posts: 15
Here is the jsp-webwork webpage code

<%@ taglib prefix="ww" uri="webwork" %>
<%@ page contentType="text/html; charset=UTF-8" %>

<html>
<body>
<ww:push value="dataset">
<td><ww:iterator value="parameters">
<a href="<ww:url value="'showParameter.action' + (#status.count-1)"/>">
<b><ww:property value="name"/></br></b>
</a>
</ww:iterator></td>
</ww:push>
</body>
</html>


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 17, 2004 11:07 pm 
Newbie

Joined: Wed Feb 11, 2004 12:03 pm
Posts: 15
Nobody has an idea please ^^; ?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 18, 2004 5:07 am 
Newbie

Joined: Thu May 06, 2004 10:10 am
Posts: 14
i'm currently struggling with this problem as well. I'm trying to find a hook in Struts's RequestProcessor class where i can modify it so it calls HibernateUtil.closeSession() after the whole page has been rendered... That idea seems promising to me...


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 18, 2004 5:21 am 
Newbie

Joined: Mon Jun 07, 2004 9:18 am
Posts: 13
Location: Torino, Italy
Make sure you don't store in the httpsession any Hibernate-retrieved object (that you don't re-associate with the current hibernatesession).

If you do so, the hibernatesession would be closed and you will have in the httpsession a detached object.
A new request comes in, you load some object, in the JSP you refer to the object stored in the httpsession, which is detached.

All in all, make sure *every* object you refer to has been either loaded by Hibernate, or reassociated via lock(obj, LockMode.NONE) to the current hibernatesession.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 23, 2004 10:34 am 
Newbie

Joined: Wed Feb 11, 2004 12:03 pm
Posts: 15
simonebordet wrote:
Make sure you don't store in the httpsession any Hibernate-retrieved object (that you don't re-associate with the current hibernatesession).

If you do so, the hibernatesession would be closed and you will have in the httpsession a detached object.
A new request comes in, you load some object, in the JSP you refer to the object stored in the httpsession, which is detached.

All in all, make sure *every* object you refer to has been either loaded by Hibernate, or reassociated via lock(obj, LockMode.NONE) to the current hibernatesession.

Hu ?
But where is the lazy loading in what you are proposing ???
Isn't the lazy loading a way to dynamically access datas that haven't been mapped back yet from the database ?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 23, 2004 11:34 am 
Newbie

Joined: Mon Jun 07, 2004 9:18 am
Posts: 13
Location: Torino, Italy
MusuL wrote:
Hu ?
But where is the lazy loading in what you are proposing ???
Isn't the lazy loading a way to dynamically access datas that haven't been mapped back yet from the database ?


Don't ask me what your application is doing: from the stack trace is obvious that you're trying to iterate over a lazy collection belonging to an object loaded with a hibernate session that has been closed.

Lazy loading works well until you have an open session. If you close it, how can it go to the DB to retrieve the data ?

Simon


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 04, 2004 3:38 pm 
Beginner
Beginner

Joined: Thu May 27, 2004 3:07 pm
Posts: 20
can't it allocate a new session from the session factory?
Why should my application have to worry about hibernate?
I'd like to take care of everything inside of my DAO layer, and
leave hibernate completely out of my application. It seems there's
no way to do this, and still have lazy loading available.

This makes it extremely hard to implement a wizard type flow where you load an object on the first page, keep it in session, and edit it as you go from page to page. You'd have to deliberately access the hibernate layer on every request to re-attach the object if it was lazy loaded. That doesn't seem good to me. Shouldn't a lazy loaded object also have a reference to it's session factory so that if it's session is closed, it can go back to the session factory to get a session from which to load the data?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 04, 2004 3:45 pm 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
You should read more documentation, the Wiki area, and possibly Hibernate in Action. There are good reasons why it "shouldn't".

_________________
JAVA PERSISTENCE WITH HIBERNATE
http://jpwh.org
Get the book, training, and consulting for your Hibernate team.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 04, 2004 4:49 pm 
CGLIB Developer
CGLIB Developer

Joined: Thu Aug 28, 2003 1:44 pm
Posts: 1217
Location: Vilnius, Lithuania
There is no good reasons for "re-attach" if user repeats this code himself, but
it is better not to store any fat objects in http session for scalability reasons, it solves lazy loading problem too.
Workaround is to store user input only in http session, hidden fields are better for scalability and it helps for stuff like load balancing, but it can be too "boring" in some cases and probably less secure.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 10 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.