cocoon-docs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d...@cocoon.apache.org
Subject [Cocoon Wiki] Updated: CocoonAndHibernateTutorial
Date Mon, 29 Nov 2004 10:45:13 GMT
   Date: 2004-11-29T02:45:13
   Editor: JohannesTextor <jc.textor@gmx.de>
   Wiki: Cocoon Wiki
   Page: CocoonAndHibernateTutorial
   URL: http://wiki.apache.org/cocoon/CocoonAndHibernateTutorial

   no comment

Change Log:

------------------------------------------------------------------------------
@@ -19,8 +19,14 @@
 
 === Your basic skills ===
 
+Time. If you are new to the topic of O/R mapping, you will need a lot 
+of time and patience, because it is not an easy topic. Learning Cocoon already
+made you re-think your concept of a Web Application; learning Hibernate, you
+will have to do it again. 
+
 You should have basic Cocoon knowledge, i.e. about the Sitemap, Flowscript,
-and JX Templates. The samples included will also use CForms. 
+and JX Templates. The samples included will also use CForms. Did I mention 
+Flowscript ? That one is especially important. 
 
 If you want to use Hibernate you should also be fluent in Java. Be warned that
 you are going beyond the "no programming required" - statement of the Cocoon 
@@ -29,6 +35,10 @@
 takes care of Hibernate Session, so if you don't know what a Servlet Filter is 
 get your favourite book or search engine and read up :) 
 
+You will have a basic notion of what Hibernate is and what it does, otherwise
+you would not have come to this page :) But make sure you have understood what
+lazy collection initialization is and what it does. 
+
 === Technical prerequisites ===
 
 A running cocoon installation. I tried this on Cocoon 2.1.6. It might work 
@@ -270,11 +280,47 @@
 or later experience the (in)famous Lazy Initialization Problem (tm). The solution for this
problem is to
 create a servlet filter to manage Hibernate Sessions, so if you are'nt fed up on Java yet
read on :) 
 
-= A Servlet Filter for Managing Hibernate Sessions =
+== A Servlet Filter for Managing Hibernate Sessions ==
+
+=== Why ? ===
+
+(If you just want to continue installing and are not bothering about the Why, skip this part
and come
+back later ...) 
+
+If you're getting serious about Hibernate, sooner or later you will want to use lazy collection
initialization
+(Read the corresponding section in GettingStartedWithCocoonAndHibernate for an introduction
on this topic).
+Say you are accessing Hibernate sessions from flowscript, i.e. as follows: 
+
+{{{
+  var factory = cocoon.getComponent(Packages.org.test.PersistenceFactory.ROLE);
+  var hs = factory.createSession();
+
+  var data = hs.find("from org.test.Data");
+
+  cocoon.sendPage("data-pipe", {data: data} ); 
+
+  hs.close();
+}}}
 
-== Why ? ==
+This will work for simple data objects and also for complex ones, i.e. objects that contain
collections, as long
+as you are not lazily initializing them. If not, you might experience the following problem:
Say your object contains
+a mapped collection {{{otherData}}}. In the flow snippet above, you did not access this collection,
so Hibernate
+won't load its items from the database. But it is still possible that your view pipeline
wants to access {{{otherData}}}.
+
+Now the problem is that the flowscript will just continue to process right after it has invoked
the view pipeline,
+so it is possible that the {{{hs.close()}}} will occur BEFORE your view has rendered completely.
So when the view 
+will access {{{otherData}}} after that, you will get an exception telling you that Hibernate
failed to lazily 
+initialize the collection. A classical Race Condition. 
+
+Obviously that's no good. The solution is to move Hibernate session management out of the
flowscript layer and even 
+outside cocoon. So we will create a servlet filter. A servlet filer is invoked BEFORE the
request is passed to cocoon 
+and will be notified when the request is processed completely. At that point we can safely
close the Hibernate session,
+given we will not continue to work with it from flowscript after the view pipeline has been
invoked. However, invoking
+the view pipeline should be the last thing you do in a flow script anyway, so that won't
be too much of a problem.
 
+=== Creating the filter ===
 
+=== Installing the filter ===
 
 == Appendix ==
 

Mime
View raw message