Sorry, I'm quite late with the answer.

OpenSessionInViewFilter should be able to handle such issue providing you use 
the Spring SessionFactoryUtils.

--ERic
On Thursday 08 June 2006 18:37, albartell wrote:
> Ok, I have looked into the Tapestry+Spring+Hibernate approach prescribed by
> Eric and have some questions.  I am going to go into some code depth for
> the archives. Note that I have visited
> http://wiki.apache.org/tapestry/FrequentlyAskedQuestions/SpringHibernate
> and some other threads in this list but think that I still need some final
> clarification from someone who has lived it and can state that my following
> scenario will be addressed by the introduction of Spring into the mix.
>
> Currently I use myeclipseide.com to generate my DAO POJO's from MySQL
> tables. In the relationship of a Lead (parent) to Leadtag (child) it
> creates the following class (note the absence of any Hibernate related
> code)...
>
> public abstract class AbstractLead  implements java.io.Serializable {
>     private Set leadtags = new HashSet(0);
> ...code ommitted for brevity sake...
>     public Set getLeadtags() {
>         return this.leadtags;
>     }
>     public void setLeadtags(Set leadtags) {
>         this.leadtags = leadtags;
>     }
> }
>
>
> The above is "fronted" by the Lead.hbm.xml file which is as follows:
> <hibernate-mapping>
>     <class name="com.rxs.dao.Lead" table="lead" catalog="rxsweb">
>         <id name="leaduid" type="java.lang.Integer">
>             <column name="leaduid" />
>             <generator class="native" />
>         </id>
>  ...code ommitted for brevity sake...
>         <set name="leadtags" inverse="true">
>             <key>
>                 <column name="leaduid" not-null="true" />
>             </key>
>             <one-to-many class="com.rxs.dao.Leadtag" />
>         </set>
>     </class>
> </hibernate-mapping>
>
>
> My hibernate.cfg.xml file is configured as follows:
> <hibernate-configuration>
>       <session-factory>
>               <property
> name="connection.datasource">java:comp/env/jdbc/rxscp</property>
>               <property
> name="dialect">org.hibernate.dialect.MySQLDialect</property>
>               <property name="hibernate.show_sql">true</property>
>
>               <mapping resource="com/rxs/dao/Lead.hbm.xml" />
>               <mapping resource="com/rxs/dao/Leadtag.hbm.xml"></mapping>
>       </session-factory>
> </hibernate-configuration>
>
> I configure the DBCP (specified above) in the /META-INF/context.xml file as
> follows:
> <Context path="/rxs" docBase="/rxs"
>  debug="0" reloadable="false">
>       <Resource
>               name="jdbc/rxscp"
>               auth="Container"
>               type="javax.sql.DataSource"
>               factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
>
>               maxActive="100"
>               maxIdle="30"
>               minIdle="10"
>               maxWait="15000"
>               username="myuser"
>               password="mypassword"
>               driverClassName="com.mysql.jdbc.Driver"
>               url="jdbc:mysql://localhost:3306/mydb"
>               removeAbandoned="true"
>               removeAbandonedTimeout="300"
>               validationQuery="select 1"
>               logAbandoned="true"
>               testOnBorrow="true"
>               testOnReturn="true"
>               testWhileIdle="true"
>                />
> </Context>
>
> Here is where my problem comes. I traditionally have used a Servlet filter
> to initiate a single session per request as per the below DBConn.java code.
> When I need to make a call to the database I simply do a
> DBConn.sess().createQuery(...etc.  The DBConn.sess() approach works great
> for when I want to manually do a specific query that isn't facilitated by
> the getters built by myeclipseide.com; but when I want to make use of
> getLeadtags() to produce a list it is not using DBConn.sess() but is
> instead invoking a new DB connection somehow someway (I have no idea how it
> does it, I just like the work I DON'T have to do:-)
>
> So I guess my question is this: Given the two methods of DB access I am
> doing (i.e. manual way using DBConn.sess(), and Hibernates zero code
> approach) will OpenSessionInViewFilter be able to appropriately intercept
> both and my lazy loading woes will be resolved?
>
>
> public class DBConn implements Filter {
>     private static Logger logger = Logger.getLogger(DBConn.class.getName())
>     private static SessionFactory sessionFactory;
>     private static ThreadLocal tl = new ThreadLocal();
>
>     static {
>         try {
>             sessionFactory = new
> Configuration().configure().buildSessionFactory();
>         } catch (HibernateException e) {
>             System.err.println("Initial SessionFactory creation failed." +
> e);
>             e.printStackTrace();
>             throw new ExceptionInInitializerError(e);
>         }
>     }
>     public void doFilter(ServletRequest request, ServletResponse response,
> FilterChain chain)
>             throws IOException, ServletException {
>         try {
>             chain.doFilter(request, response);
>         } finally {
>             Session s = (Session) tl.get();
>             if (s != null) {
>                 try {
>                     s.flush();
>                     s.close();
>                 } catch (HibernateException e) {
>                     e.printStackTrace();
>                 }
>                 tl.set(null);
>             }
>         }
>     }
>     public static Session sess() {
>         Session s = (Session) tl.get();
>         if (s == null || !s.isOpen()) {
>             try {
>                 s = sessionFactory.openSession();
>             } catch (HibernateException e) {
>                 e.printStackTrace();
>             }
>             tl.set(s);
>         }
>         return s;
>     }
>     public void init(FilterConfig filterConfig) throws ServletException {
>     }
>     public void destroy() {
>     }
> }
>
> Aaron Bartell
> http://mowyourlawn.com/blog
>
> -----Original Message-----
> From: Eric Fesler [mailto:[EMAIL PROTECTED]
> Sent: Thursday, June 08, 2006 8:26 AM
> To: Tapestry users
> Subject: Re: @For within a @contrib:Table
>
> Hi,
>
> I already had this issue in the past. It was due to the fact that the
> leadtagtype (or equivalent) method was called on the leadtag bean after the
> hibernate session was closed.
>
> There are two ways to solve the issue.
> 1°) Do not use lazy loading for the leadtagtype association
> 2°) Use the OpenSessionInViewFilter of the Spring framework. This filter
> opens the session only once per request and close it at the end of the
> request.
>
> --ERic
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]

-- 
Eric Fesler
Technical Director
-------------------------------------------------------------------
 Audaxis S.A.
 Tel: +32 (0)2 361.83.01 
 Fax: +32 (0)2 361.83.11 
 Mob: +32 (0)478 22.90.78 
 http://www.audaxis.com
 
 PGP Fingerprint : FECF 2841 48B7 47D8 C426 55A4 0A60 FB52 833B 1EF1
 Public PGP key  : available at server subkeys.pgp.net
-------------------------------------------------------------------

It is often the case that the man who can't tell a lie thinks he is the best
judge of one.
                -- Mark Twain, "Pudd'nhead Wilson's Calendar"

Attachment: pgpp5GLSzbVCB.pgp
Description: PGP signature

Reply via email to