Jeff,

Thanks for adding your filter to the wiki.  However, I'm looking for an even
simpler solution.  I'd like to use Thread Local Session
(http://hibernate.bluemars.net/42.html) in combination with a Filter, so I
can still obtain sessions in my JUnit tests, and I'm not duplicating code in
the web tier.  BTW - your filter complains about setting a static variable
from a non-static context: this.factory =
(SessionFactory)ctx.lookup(factoryJndiName);

Here's the doFilter method I've come up with - and it seems to work just
fine.  The only problem being that it's opening a session for each request.
A better solution would be to declaratively specify which servlets need a
connection - or use something like your getSession() method.

Thanks,

Matt

public void doFilter(ServletRequest request, ServletResponse response,
                                         FilterChain chain)
  throws IOException, ServletException {
        Session ses = null;
        boolean sessionCreated = false;

        try {
                // Get the http session id from the request, then we will 
                // try to get  the Hiberate Session from the request.  If 
                // it doesn't exist, then we will create it, otherwise
                // we will use the one that already exists.
                ses = (Session) request.getAttribute(Constants.SESSION_KEY);

                if (ses == null) {
                        ses = HibernateSession.currentSession();

                        request.setAttribute(Constants.SESSION_KEY, ses);
                        sessionCreated = true;
                }
        } catch (Exception exc) {
                log.error("Error opening Hibernate session.", exc);
                exc.printStackTrace();
        }

        try {
                chain.doFilter(request, response);
        } finally {
                try {
                        if (sessionCreated) {
                                HibernateSession.closeSession();
                        }
                } catch (Exception exc) {
                        log.error("Error closing hibernate session.", exc);
                        exc.printStackTrace();
                }
        }
}



> -----Original Message-----
> From: Schnitzer, Jeff [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, January 28, 2003 6:55 PM
> To: [EMAIL PROTECTED]
> Subject: RE: [Hibernate] Obtaining session in a filter
> 
> 
> I just added my filter to the Wiki; I recommend using that :-)
> 
> http://hibernate.bluemars.net/43.html
> 
> Jeff Schnitzer
> [EMAIL PROTECTED]
> 
> > -----Original Message-----
> > From: Raible, Matt [mailto:[EMAIL PROTECTED]
> > Sent: Tuesday, January 28, 2003 4:06 PM
> > To: '[EMAIL PROTECTED]'
> > Subject: [Hibernate] Obtaining session in a filter
> > 
> > I'm trying to migrate my app to use a Session at the UI 
> level, and to
> pass
> > this session down to my services and persistence layers.  In my
> Filter,
> > I'm
> > basically calling a HibernateSession class which looks like the
> > ThreadLocal
> > pattern from the design patterns on the wiki.  Below is my doFilter
> > method.
> > 
> > The basic problem I'm experiencing can be seen from the 
> following log
> > snip:
> > 
> > DEBUG [Ajp13Processor[11009][4]] 
> HibernateFilter.doFilter(86) | Closed
> > hibernate session.
> > DEBUG [Ajp13Processor[11009][3]] 
> HibernateFilter.doFilter(62) | Opened
> > hibernate session.
> > DEBUG [Ajp13Processor[11009][3]] 
> HibernateFilter.doFilter(62) | Opened
> > hibernate session.
> > DEBUG [Ajp13Processor[11009][3]] CMCFAction.save(117) | Entering
> 'save'
> > method
> > com.comcast.cable.dmc.itd.cct.persistence.DAOException:
> > cirrus.hibernate.HibernateException: Session
> >  is currently disconnected
> > 
> > Is the code below the best way to implement the UI Filter 
> pattern?  It
> was
> > fairly easy for me to refactor, but I think I'm probably doing
> something
> > wrong.  Part of the refactoring process was to remove all 
> the finally
> > blocks
> > from my methods where I used to be calling
> > HibernateSession.closeSession();
> > Should I be calling HibernateSession.closeSession() in the finally
> block
> > of
> > this method.
> > 
> > Thanks for any advice,
> > 
> > Matt
> > 
> >     public void doFilter(ServletRequest request, ServletResponse
> response,
> >                          FilterChain chain)
> >       throws IOException, ServletException {
> >         Session ses = null;
> >         boolean sessionCreated = false;
> > 
> >         try {
> >             // Get the http session id from the request, 
> then we will
> >             // try to get  the Hiberate Session from the 
> request.  If
> >             // it doesn't exist, then we will create it, otherwise
> >             // we will use the one that already exists.
> >             ses = (Session)
> request.getAttribute(Constants.SESSION_KEY);
> > 
> >             if (ses == null) {
> >                 ses = HibernateSession.currentSession();
> > 
> >                 if (log.isDebugEnabled()) {
> >                     log.debug("Opened hibernate session.");
> >                 }
> > 
> >                 request.setAttribute(Constants.SESSION_KEY, ses);
> >                 sessionCreated = true;
> >             }
> >         } catch (Exception exc) {
> >             log.error("Error opening Hibernate session.", exc);
> >                     exc.printStackTrace();
> >         }
> > 
> >         try {
> >             chain.doFilter(request, response);
> >         } finally {
> >             try {
> >                 if (sessionCreated) {
> >                     if (ses != null) {
> >                         // Only try to close the connection if it is
> open,
> >                         // since it might have been closed somewhere
> else
> >                         // by mistake.
> >                         if (ses.isOpen()) {
> >                             ses.close();
> > 
> >                             if (log.isDebugEnabled()) {
> >                                 log.debug("Closed hibernate
> session.");
> >                             }
> >                         }
> >                     }
> >                 }
> >             } catch (Exception exc) {
> >                 log.error("Error closing hibernate session.", exc);
> >                 exc.printStackTrace();
> >             }
> >         }
> >     }
> > 
> > 
> > 
> > -------------------------------------------------------
> > This SF.NET email is sponsored by:
> > SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
> > http://www.vasoftware.com
> > _______________________________________________
> > hibernate-devel mailing list
> > [EMAIL PROTECTED]
> > https://lists.sourceforge.net/lists/listinfo/hibernate-devel
> 
> 
> 
> -------------------------------------------------------
> This SF.NET email is sponsored by:
> SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
> http://www.vasoftware.com
> _______________________________________________
> hibernate-devel mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/hibernate-devel
> 



-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
hibernate-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hibernate-devel

Reply via email to