Hi,
I am building a persistence layer using Spring 1.2.3 and Hibernate 3.0.5 to be incorporated in a Websphere 4.0.6 environment (JDK1.3.1), with a Sybase DB. The Sybase driver (or Sybase version) cannot be JTA compliant. I read that some DAO/Spring pattern cannot be use. I hope I am not using it...
I would like my DAO to participate in the current CMT transaction. It mean that Hibernate/spring should never create its own transaction, or commit it.
Also, I would like that the Hibernate Session be associate to the CMT transaction (in a Session per transaction pattern). I could then use the Hibernate Pojo (browse inside) inside the EJB methode without worrying if the connection is close or not.
I think I have manage to make things works, but I still have problem with the transaction and session issues configuration/programmatic. Could anyone help with this?
This is my DAO implementation:
Code:/* * Bookeeping is called with a composit key (request + SeqId) /* public class BookkeepingDaoImpl extends HibernateDaoSupport implements BookkeepingDao { public Bookkeeping findBookkeepingById(int fkRequest_UID, int seqNo){ BookkeepingId bid = new BookkeepingId(request, seqNo); Bookkeeping bk = (Bookkeeping)getHibernateTemplate().load(Bookkeeping.class, bid); System.out.println("testing Bookkeeping getSettlementDate: " + bk.getSettlementDate()); return bk; } }
and this is my mapping:
An this is the EJB calling the DAO implementation of Bookeeping:Code:<!-- THIS Connection JNDI- - mlevel test only --> <!-- JNDI Environment Template --> <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> <property name="environment"> <props> <prop key="java.naming.factory.initial">com.ibm.websphere.naming.WsnInitialContextFactory</prop> <prop key="java.naming.provider.url">iiop://10.160.97.104:900</prop> </props> </property> </bean> <bean id="data-source" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiTemplate"> <ref bean="jndiTemplate"/> </property> <property name="jndiName"> <value>jdbc/sybasedev</value> </property> </bean> <!--bookkeeping DAO --> <bean id="bookkeepingDao" class="com.eg.dao.impl.BookkeepingDaoImpl"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="mappingResources"> <list> <value>com/eg/model/Bookkeeping.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SybaseDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.generate_statistics">true</prop> </props> </property> <property name="dataSource"><ref bean="data-source" /></property> </bean>
Code:/** * Bean implementation class for Enterprise Bean: TestTransactionBean */ public class TestTransactionBeanBean extends AbstractStatelessSessionBean{ private javax.ejb.SessionContext mySessionCtx; private BookkeepingDao bookkeepingDao; /* (non-Javadoc) * @see org.springframework.ejb.support.AbstractStatelessSessionBean#onEjbCreate() */ protected void onEjbCreate() throws CreateException { bookkeepingDao = (BookkeepingDao)getBeanFactory().getBean("bookkeepingDao"); } /** * setSessionContext */ public void setSessionContext(javax.ejb.SessionContext ctx) { super.setSessionContext(ctx); setBeanFactoryLocator(ContextSingletonBeanFactoryLocator.getInstance("classpath*:test-main-context.xml")); setBeanFactoryLocatorKey(EjbConstants.BEAN_FACTORY_JNDI); } public void testSpringDaoAccess() { Bookkeeping bk = bookkeepingDao.findBookkeepingById(6175, 1); System.out.println("bk.getAmount()" + bk.getAmount()); } }
When I run the EJB and try to call the testSpringDaoAccess method, I get a Exception telling me the session has been closed. I dont quite well understand the life-cycle of the Session and Transaction. I put the log to DEBUG for Hibernate and this is what I got:
Code:[22/08/05 12:59:44:355 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:44,355 DEBUG [Servlet.Engine.Transports:10] (SessionFactoryObjectFactory.java:39) - initializing class SessionFactoryObjectFactory [22/08/05 12:59:44:355 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:44,355 DEBUG [Servlet.Engine.Transports:10] (SessionFactoryObjectFactory.java:76) - registered: 8a20e1e805df21880105df2195430000 (unnamed) [22/08/05 12:59:44:355 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:44,355 INFO [Servlet.Engine.Transports:10] (SessionFactoryObjectFactory.java:82) - Not binding factory to JNDI, no JNDI name configured [22/08/05 12:59:44:355 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:44,355 DEBUG [Servlet.Engine.Transports:10] (SessionFactoryImpl.java:262) - instantiated session factory [22/08/05 12:59:44:417 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:44,355 INFO [Servlet.Engine.Transports:10] (SessionFactoryImpl.java:379) - Checking 0 named queries [22/08/05 12:59:45:323 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:45,323 DEBUG [Servlet.Engine.Transports:10] (SessionImpl.java:250) - opened session at timestamp: 4606894019629056 [22/08/05 12:59:45:339 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:45,339 DEBUG [Servlet.Engine.Transports:10] (DefaultLoadEventListener.java:143) - loading entity: [com.eg.model.Bookkeeping#component[request,seqNo]{seqNo=1, request=com.eg.model.Request#6175}] [22/08/05 12:59:45:339 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:45,339 DEBUG [Servlet.Engine.Transports:10] (DefaultLoadEventListener.java:216) - creating new proxy for entity [22/08/05 12:59:45:355 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:45,355 DEBUG [Servlet.Engine.Transports:10] (JDBCContext.java:322) - after autocommit [22/08/05 12:59:45:355 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:45,355 DEBUG [Servlet.Engine.Transports:10] (SessionImpl.java:403) - after transaction completion [22/08/05 12:59:45:355 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:45,355 DEBUG [Servlet.Engine.Transports:10] (SessionImpl.java:269) - closing session [22/08/05 12:59:45:370 EDT] 55d2b2f9 SystemOut U 2005-08-22 12:59:45,355 ERROR [Servlet.Engine.Transports:10] (LazyInitializationException.java:19) - could not initialize proxy - the owning Session was closed org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:84) at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:134) at com.eg.model.Bookkeeping$$EnhancerByCGLIB$$937253be.getSettlementDate(<generated>) at com.eg.dao.impl.BookkeepingDaoImpl.findBookkeepingById(BookkeepingDaoImpl.java:23) at com.eg.transaction.TestTransactionBeanBean.testSpringDaoAccess(TestTransactionBeanBean.java:51) at com.eg.transaction.EJSRemoteStatelessTestTransactionBean_80af6024.testSpringDaoAccess(EJSRemoteStatelessTestTransactionBean_80af6024.java:22) at com.eg.transaction._TestTransactionBean_Stub.testSpringDaoAccess(_TestTransactionBean_Stub.java:254) at java.lang.reflect.Method.invoke(Native Method) at com.ibm.etools.utc.model.ReflectionMethodModel.invoke(ReflectionMethodModel.java:68) at com.ibm.etools.utc.servlet.InvokeServlet.invoke(InvokeServlet.java:110) at com.ibm.etools.utc.servlet.InvokeServlet.doPost(InvokeServlet.java:366) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at com.ibm.servlet.engine.webapp.StrictServletInstance.doService(ServletManager.java:827) at com.ibm.servlet.engine.webapp.StrictLifecycleServlet._service(StrictLifecycleServlet.java:167) at com.ibm.servlet.engine.webapp.IdleServletState.service(StrictLifecycleServlet.java:297) at com.ibm.servlet.engine.webapp.StrictLifecycleServlet.service(StrictLifecycleServlet.java:110) at com.ibm.servlet.engine.webapp.ServletInstance.service(ServletManager.java:472) at com.ibm.servlet.engine.webapp.ValidServletReferenceState.dispatch(ServletManager.java:1012) at com.ibm.servlet.engine.webapp.ServletInstanceReference.dispatch(ServletManager.java:913) at com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java:721) at com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:374) at com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:118) at com.ibm.servlet.engine.srt.WebAppInvoker.doForward(WebAppInvoker.java:134) at com.ibm.servlet.engine.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:239) at com.ibm.servlet.engine.invocation.CachedInvocation.handleInvocation(CachedInvocation.java:67) at com.ibm.servlet.engine.invocation.CacheableInvocationContext.invoke(CacheableInvocationContext.java:106) at com.ibm.servlet.engine.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:154) at com.ibm.servlet.engine.oselistener.OSEListenerDispatcher.service(OSEListener.java:317) at com.ibm.servlet.engine.http11.HttpConnection.handleRequest(HttpConnection.java:60) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:477) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:351) at com.ibm.ws.util.CachedThread.run(ThreadPool.java:144) [22/08/05 12:59:45:370 EDT] 55d2b2f9 ExceptionUtil X CNTR0020E: Non-application exception occurred while processing method testSpringDaoAccess on bean BeanId(EJBApplicationProject#EJBApplicationProjectEJB.jar#TestTransactionBean, null): org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:84) at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:134) at com.eg.model.Bookkeeping$$EnhancerByCGLIB$$937253be.getSettlementDate(<generated>) at com.eg.dao.impl.BookkeepingDaoImpl.findBookkeepingById(BookkeepingDaoImpl.java:23) at com.eg.transaction.TestTransactionBeanBean.testSpringDaoAccess(TestTransactionBeanBean.java:51) at com.eg.transaction.EJSRemoteStatelessTestTransactionBean_80af6024.testSpringDaoAccess(EJSRemoteStatelessTestTransactionBean_80af6024.java:22) at com.eg.transaction._TestTransactionBean_Stub.testSpringDaoAccess(_TestTransactionBean_Stub.java:254) at java.lang.reflect.Method.invoke(Native Method) at com.ibm.etools.utc.model.ReflectionMethodModel.invoke(ReflectionMethodModel.java:68) at com.ibm.etools.utc.servlet.InvokeServlet.invoke(InvokeServlet.java:110) at com.ibm.etools.utc.servlet.InvokeServlet.doPost(InvokeServlet.java:366) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at com.ibm.servlet.engine.webapp.StrictServletInstance.doService(ServletManager.java:827) at com.ibm.servlet.engine.webapp.StrictLifecycleServlet._service(StrictLifecycleServlet.java:167) at com.ibm.servlet.engine.webapp.IdleServletState.service(StrictLifecycleServlet.java:297) at com.ibm.servlet.engine.webapp.StrictLifecycleServlet.service(StrictLifecycleServlet.java:110) at com.ibm.servlet.engine.webapp.ServletInstance.service(ServletManager.java:472) at com.ibm.servlet.engine.webapp.ValidServletReferenceState.dispatch(ServletManager.java:1012) at com.ibm.servlet.engine.webapp.ServletInstanceReference.dispatch(ServletManager.java:913) at com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java:721) at com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:374) at com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:118) at com.ibm.servlet.engine.srt.WebAppInvoker.doForward(WebAppInvoker.java:134) at com.ibm.servlet.engine.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:239) at com.ibm.servlet.engine.invocation.CachedInvocation.handleInvocation(CachedInvocation.java:67) at com.ibm.servlet.engine.invocation.CacheableInvocationContext.invoke(CacheableInvocationContext.java:106) at com.ibm.servlet.engine.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:154) at com.ibm.servlet.engine.oselistener.OSEListenerDispatcher.service(OSEListener.java:317) at com.ibm.servlet.engine.http11.HttpConnection.handleRequest(HttpConnection.java:60) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:477) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:351) at com.ibm.ws.util.CachedThread.run(ThreadPool.java:144)
Can anyone help me please?
Etienne.


Reply With Quote