You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by albartell <al...@gmail.com> on 2006/06/07 19:43:47 UTC

@For within a @contrib:Table

I am having an odd issue. When the below executes it obtains ognl:dataItems
just fine, but when it gets to the internal @For loop an error is thrown:
 
ognl.OgnlException... source is null for getProperty(null, "leadtagtype")
 
The problem seems to be that the contrib:Table isn't waiting for the
leadtagtype method to be called/loaded (which is lazy loaded by Hibernate),
because when I run it through debug leadtagtype DOES get called, but not
until after the page has rendered. Anybody else ever have this problem?  
 
   <table jwcid="table@contrib:Table" source="ognl:dataItems" 
 
columns="leadtag,leaduid,firstname,lastname,cmpyname,expirehigh,salepercent,
procgroup,serialnbr,model,action" 
          rowsClass="ognl:beans.evenOdd.next"
          pageSize="12">
   
     <span jwcid="leadtagColumnValue@Block"> 
      <table cellpadding="0" cellspacing="0">
        <tr jwcid="leadtags@For"
source="ognl:components.table.tableRow.leadtags" value="ognl:leadtag"
element="tr">          
          <td>
              <span jwcid="name@Insert"
value="ognl:leadtag.leadtagtype.name"/>                     
          </td>
        </tr>
      </table>    
     </span>
</table>
 
Thanks in advance,
Aaron Bartell
http://mowyourlawn.com/blog
 

RE: @For within a @contrib:Table

Posted by albartell <al...@gmail.com>.
Thanks Eric, that makes sense as to why it is occurring.  I am going to
shoot for option 2 below as right now I am doing my Hibernate open/close of
the session through a servlet filter.

Thanks again,
Aaron Bartell 

-----Original Message-----
From: Eric Fesler [mailto:eric@audaxis.com] 
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

On Wednesday 07 June 2006 19:43, albartell wrote:
> I am having an odd issue. When the below executes it obtains 
> ognl:dataItems just fine, but when it gets to the internal @For loop an
error is thrown:
>
> ognl.OgnlException... source is null for getProperty(null, 
> "leadtagtype")
>
> The problem seems to be that the contrib:Table isn't waiting for the 
> leadtagtype method to be called/loaded (which is lazy loaded by 
> Hibernate), because when I run it through debug leadtagtype DOES get 
> called, but not until after the page has rendered. Anybody else ever have
this problem?
>
>    <table jwcid="table@contrib:Table" source="ognl:dataItems"
>
> 
>columns="leadtag,leaduid,firstname,lastname,cmpyname,expirehigh,saleper
>cent
>, procgroup,serialnbr,model,action"
>           rowsClass="ognl:beans.evenOdd.next"
>           pageSize="12">
>
>      <span jwcid="leadtagColumnValue@Block">
>       <table cellpadding="0" cellspacing="0">
>         <tr jwcid="leadtags@For"
> source="ognl:components.table.tableRow.leadtags" value="ognl:leadtag"
> element="tr">
>           <td>
>               <span jwcid="name@Insert"
> value="ognl:leadtag.leadtagtype.name"/>
>           </td>
>         </tr>
>       </table>
>      </span>
> </table>
>
> Thanks in advance,
> Aaron Bartell
> http://mowyourlawn.com/blog

--
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
-------------------------------------------------------------------

In the plot, people came to the land; the land loved them; they worked and
struggled and had lots of children.  There was a Frenchman who talked funny
and a greenhorn from England who was a fancy-pants but when it came to the
crunch he was all courage.  Those novels would make you retch.
		-- Canadian novelist Robertson Davies, on the generic
Canadian
		   novel.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Tapestry+Spring+Hibernate was ->RE: @For within a @contrib:Table

Posted by James Carman <ja...@carmanconsulting.com>.
Sure it would, but "rolling your own" Tapestry/Hibernate integration seems
silly when you have something like Tapernate to use. :-)

> 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:eric@audaxis.com]
>> 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: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>
> --
> 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"
>


James Carman, President
Carman Consulting, Inc.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Tapestry+Spring+Hibernate was ->RE: @For within a @contrib:Table

Posted by Eric Fesler <er...@audaxis.com>.
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:eric@audaxis.com]
> 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: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org

-- 
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"

Tapernate HOWTO ->RE: Tapestry+Spring+Hibernate

Posted by albartell <al...@gmail.com>.
Looks very promising James!

I am trying to implement it and have been all over the place trying to find
an example.  I got to this from the page you specified:
http://www.carmanconsulting.com/mvn/com/carmanconsulting/tapernate-example/0
.1/ but the tapernate-example-1.0.jar file only has *.class files.

I then went and installed Subclipse so I could get the source from SVN
hoping for an example or readme.txt, but nothing.

I have my hivemind contribution setup complete (I believe, see below), but I
don't see where I can get a Hibernate Session from? 


Hivemodule.xml
...
	<contribution configuration-id="hivemind.hibernate3.Configuration">
	  <configuration-file>hibernate.cfg.xml</configuration-file>
	  <mapping-file>com/rxs/dao/Lead.hbm.xml</mapping-file>
	  <mapping-file>com/rxs/dao/Affiliate.hbm.xml</mapping-file>
	  <mapping-file>com/rxs/dao/Reqext.hbm.xml</mapping-file>
	  <mapping-file>com/rxs/dao/Leadtag.hbm.xml</mapping-file>
	  <mapping-file>com/rxs/dao/Translog.hbm.xml</mapping-file>
	  <mapping-file>com/rxs/dao/Leadtagtype.hbm.xml</mapping-file>
	  <mapping-file>com/rxs/dao/Sysctl.hbm.xml</mapping-file>
	  <property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLDialect"/>
	  <class>com.rxs.dao.Affiliate</class>
	  <class>com.rxs.dao.Lead</class>
	  <class>com.rxs.dao.Leadtag</class>
	  <class>com.rxs.dao.Leadtagtype</class>
	  <class>com.rxs.dao.Reqext</class>
	  <class>com.rxs.dao.Translog</class>
	  <class>com.rxs.dao.Sysctl</class>	
	</contribution>

Thanks,
Aaron Bartell
http://mowyourlawn.com/blog

-----Original Message-----
From: James Carman [mailto:james@carmanconsulting.com] 
Sent: Thursday, June 08, 2006 11:44 AM
To: 'Tapestry users'
Subject: RE: Tapestry+Spring+Hibernate was ->RE: @For within a
@contrib:Table

Or, use Tapernate!  Other folks are using it and they seem to like it a lot.
It does roughly the same thing as the Spring OpenSessionInViewFilter, but it
also does a whole lot more.  Check out the documentation at:

www.carmanconsulting.com/tapernate

James


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


RE: Tapestry+Spring+Hibernate was ->RE: @For within a @contrib:Table

Posted by James Carman <ja...@carmanconsulting.com>.
Or, use Tapernate!  Other folks are using it and they seem to like it a lot.
It does roughly the same thing as the Spring OpenSessionInViewFilter, but it
also does a whole lot more.  Check out the documentation at:

www.carmanconsulting.com/tapernate

James

-----Original Message-----
From: albartell [mailto:albartell@gmail.com] 
Sent: Thursday, June 08, 2006 12:37 PM
To: 'Tapestry users'
Subject: Tapestry+Spring+Hibernate was ->RE: @For within a @contrib:Table

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:eric@audaxis.com] 
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: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Tapestry+Spring+Hibernate was ->RE: @For within a @contrib:Table

Posted by albartell <al...@gmail.com>.
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:eric@audaxis.com] 
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: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: @For within a @contrib:Table

Posted by Eric Fesler <er...@audaxis.com>.
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

On Wednesday 07 June 2006 19:43, albartell wrote:
> I am having an odd issue. When the below executes it obtains ognl:dataItems
> just fine, but when it gets to the internal @For loop an error is thrown:
>
> ognl.OgnlException... source is null for getProperty(null, "leadtagtype")
>
> The problem seems to be that the contrib:Table isn't waiting for the
> leadtagtype method to be called/loaded (which is lazy loaded by Hibernate),
> because when I run it through debug leadtagtype DOES get called, but not
> until after the page has rendered. Anybody else ever have this problem?
>
>    <table jwcid="table@contrib:Table" source="ognl:dataItems"
>
> columns="leadtag,leaduid,firstname,lastname,cmpyname,expirehigh,salepercent
>, procgroup,serialnbr,model,action"
>           rowsClass="ognl:beans.evenOdd.next"
>           pageSize="12">
>
>      <span jwcid="leadtagColumnValue@Block">
>       <table cellpadding="0" cellspacing="0">
>         <tr jwcid="leadtags@For"
> source="ognl:components.table.tableRow.leadtags" value="ognl:leadtag"
> element="tr">
>           <td>
>               <span jwcid="name@Insert"
> value="ognl:leadtag.leadtagtype.name"/>
>           </td>
>         </tr>
>       </table>
>      </span>
> </table>
>
> Thanks in advance,
> Aaron Bartell
> http://mowyourlawn.com/blog

-- 
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
-------------------------------------------------------------------

In the plot, people came to the land; the land loved them; they worked and
struggled and had lots of children.  There was a Frenchman who talked funny
and a greenhorn from England who was a fancy-pants but when it came to the
crunch he was all courage.  Those novels would make you retch.
		-- Canadian novelist Robertson Davies, on the generic Canadian
		   novel.