[jboss-user] [JBoss Portal] - Hibernate Open Session In View (in Portlet)

EricML do-not-reply at jboss.com
Wed Mar 26 06:25:15 EDT 2008


Hey. I'm using JBoss AS 4.2.2 GA with Portal 2.6.4 and running into problems with accessing objects in the view: 

"Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session"

I am using the HibernateService deployed as HAR to retrieve objects in the processAction-Method of the GenericPortlet. The configuration of the Service is as follows (jboss-service.xml):


  | <server>
  | 	<mbean code="org.jboss.hibernate.jmx.Hibernate"
  | 		name="ebal:name=SessionFactory">
  | 		<attribute name="DatasourceName">java:/PortalDS</attribute>
  | 		<attribute name="Dialect">
  | 			org.hibernate.dialect.MySQLDialect
  | 		</attribute>
  | 		<attribute name="SessionFactoryName">
  | 			java:/hibernate/SessionFactory
  | 		</attribute>
  | 		<attribute name="Hbm2ddlAuto">update</attribute>
  | 		<attribute name="ShowSqlEnabled">true</attribute>
  | 		<attribute name="ScanForMappingsEnabled">true</attribute>
  | 	</mbean>
  | </server>
  | 

The service uses the standard PortalDS which is bound to a transaction:


  | <datasources>
  |   <local-tx-datasource>
  |     <jndi-name>PortalDS</jndi-name>
  |     <connection-url>jdbc:mysql://localhost:3306/jbossportal?useServerPrepStmts=false</connection-url>
  |     <driver-class>org.gjt.mm.mysql.Driver</driver-class>
  |     <user-name></user-name>
  |     <password></password>
  |   </local-tx-datasource>
  | </datasources>
  | 

In the init()-Method of my Portlet I am retrieving the HibernateService:

  | public void init(javax.portlet.PortletConfig config)
  | 			throws PortletException {
  | 		super.init(config);
  | 		try {
  | 			InitialContext ctx = new InitialContext();
  | 			sessionFactory = (SessionFactory) ctx
  | 					.lookup("java:/hibernate/SessionFactory");
  | 		} catch (NamingException e) {
  | 			throw new PortletException(e.getMessage());
  | 		}
  | 	};
  | 

and later in the processAction-Method I am retrieving some objects through sessionFactory.getCurrentSession() and store them in the PortalSession. This works fine for I retrieve the current session bound to the transaction. Btw, I have also included the transattribute in the jboss-portlet.xml:


  | <portlet>
  | 		<portlet-name>TestPortlet</portlet-name>
  | 		<trans-attribute>Required</trans-attribute>
  | 	</portlet>
  | 

Everything works fine so far until I try to access properties from objects in the portletSession in the view (jsp, through jstl) which are proxied through hibernate (lazy initialized). The session is already closed in the view and so is the transaction. Normally I would set a HibernateSession filter in the web.xml and open/close the session before/after the request in a standard struts/spring mvc webapplication and have the session open in view but I fear this will not work in a portlet environment.

I did browse through this forum and the web all the day but did not come to a conclusion how to achieve to hold the session/transaction open (and closed after the entire request). 

Is there anyone who was running into the same problem? Maybe I miss something substantial because I could not find any solution to this very common problem? Is there a way to span the transaction around the view-rendering as well? Every help or hints are appreciated! 

Regards,
Eric

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4138913#4138913

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4138913



More information about the jboss-user mailing list