You are viewing a plain text version of this content. The canonical link for it is here.
Posted to docs@cocoon.apache.org by Apache Wiki <wi...@apache.org> on 2005/07/25 17:46:48 UTC
[Cocoon Wiki] Update of "CocoonAndHibernateTutorial" by JohannesTextor
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Cocoon Wiki" for change notification.
The following page has been changed by JohannesTextor:
http://wiki.apache.org/cocoon/CocoonAndHibernateTutorial
The comment on the change is:
Improved the "OpenSessionInView"-like filter.
------------------------------------------------------------------------------
- COCOON-RELEASES: 2.1.5 2.1.6 2.1.7[[BR]]
- DOCUMENT-STATUS: '''*draft*''' reviewed released[[BR]]
----
+
+ === Recent changes (as of 2005/07/25) ===
+
+ If you have visited this page before, you should check out the new Servlet Filter. It now
+ finally uses the request object instead of the servlet session to communicate with cocoon,
+ with is MUCH cleaner and most importantly does not require the creation of a Session ...
+ Sorry for taking so long to clean this up !
+
+ I am now using all of the code in a project with Hibernate 3. Probably the code snippets will
+ soon be updated to use the new Hibernate version by default.
=== What you will get from this page ===
@@ -395, +405 @@
=== Creating the filter ===
- Our filter needs to communicate with cocoon. Unfortunately, this cannot be done via the Avalon framework. I could not
+ Our filter needs to communicate with cocoon. Unfortunately, this cannot be done via the Avalon framework. The most
- come up with a better solution than abusing the servlet session context for this purpose.
+ straightforward way to get around this limitation is using the request object.
- The example filter below will search the session context for an attribute called {{{DisposeHibernateSession}}}. If found,
+ The example filter below will search the current request for an attribute called {{{DisposeHibernateSession}}}. If found,
it will try to cast the attribute value to a Hibernate Session, and close this session and the related
JDBC connection if successful.
@@ -442, +452 @@
// After cocoon has finished processing, close the
// corresponding Hibernate session if it has been opened
+ if( request.getAttribute("DisposeHibernateSession") != null )
- if(((HttpServletRequest)request).getSession(false) != null &&
- ((HttpServletRequest)request).getSession().getAttribute("DisposeHibernateSession")!=null)
{
- Session hs = (Session) ((HttpServletRequest)request).getSession().getAttribute("DisposeHibernateSession");
+ Session hs = (Session) request.getAttribute("DisposeHibernateSession");
try{
hs.flush();
hs.connection().close();
@@ -456, +465 @@
}
catch( SQLException e ){
System.out.println(e.getMessage());
- }
- ((HttpServletRequest)request).getSession().setAttribute("DisposeHibernateSession",null);
+ }
+ request.setAttribute("DisposeHibernateSession",null);
}
}
}
@@ -491, +500 @@
Since the filter only cares for disposing open sessions, you still have to open them yourself
using the {{{PersistenceFactory}}} class designed above. Also you need to make sure that every
- time a session is opened, it is correctly stored in the servlet session context such that the
+ time a session is opened, it is correctly stored in the servlet request such that the
filter will later close it.
It might be a good idea to create a
@@ -520, +529 @@
cocoon.releaseComponent(factory);
// Send "Message" to HibernateFilter to dispose the session after the view was rendered
- cocoon.session.setAttribute("DisposeHibernateSession",hs);
+ cocoon.request.setAttribute("DisposeHibernateSession",hs);
}
}}}