Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp
Hibernate version:
2.1.8
Mapping documents:
The main Entity Object:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping
>
<class
name="com.siemens.swa.domain.Activity"
table="ACTIVITY"
dynamic-update="false"
dynamic-insert="false"
select-before-update="false"
optimistic-lock="version"
>
<id
name="id"
column="ACTIVITY_ID"
type="java.lang.Long"
>
<generator class="native"/>
</id>
<many-to-one
name="equipment"
class="com.siemens.swa.domain.Equipment"
cascade="save-update"
outer-join="auto"
update="true"
insert="true"
access="property"
column="equipment_id"
foreign-key="fk_activity_equipment"
/>
<many-to-one
name="veloxInfo"
class="com.siemens.swa.domain.ActivityVeloxInfo"
cascade="all"
outer-join="auto"
unique="true"
column="act_velox_info_id"
foreign-key="fk_activity_activityveloxinfo"
/>
<many-to-one
name="activityExecution"
class="com.siemens.swa.domain.ActivityExecution"
cascade="all"
outer-join="auto"
update="true"
insert="true"
access="property"
column="act_exec_id"
foreign-key="fk_activity_activityexecution"
/>
<property
name="promiseDate"
column="promise_date"
/>
<property
name="promiseTime"
column="promise_time"
/>
<property
name="promiseEndDate"
column="promise_end_date"
/>
<property
name="promiseEndTime"
column="promise_end_time"
/>
<property
name="openChecklist"
column="open_checklist"
/>
<many-to-one
name="scheduleInfo"
class="com.siemens.swa.domain.ActivitySchedule"
cascade="all"
outer-join="auto"
access="property"
column="ACT_SCH_ID"
unique="true"
foreign-key="fk_activity_activityschedule"
/>
<property
name="activityNumber"
column="activity_num"
not-null="true"
unique="true"
/>
<property
name="state"
type="com.siemens.swa.dao.ActivityStateUserType"
update="true"
insert="true"
access="property"
column="state"
length="10"
/>
<property
name="type"
type="com.siemens.swa.dao.ActivityTypeUserType"
update="true"
insert="true"
access="property"
column="type"
length="12"
/>
<many-to-one
name="priority"
cascade="none"
class="com.siemens.swa.domain.ActivityPriority"
outer-join="auto"
column="ACT_PRIORITY_ID"
foreign-key="fk_activity_activitypriority"
/>
<set
name="preventiveChecklist"
lazy="true"
cascade="all"
sort="unsorted"
>
<key
column="ACTIVITY_ID"
>
</key>
<one-to-many
class="com.siemens.swa.domain.PreventiveChecklist"
/>
</set>
<many-to-one
name="techniqueArea"
class="com.siemens.swa.domain.TechniqueArea"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="TECHN_AREA_ID"
foreign-key="fk_activity_technique_area"
/>
<many-to-one
name="informer"
class="com.siemens.swa.domain.Informer"
cascade="all"
outer-join="auto"
update="true"
insert="true"
access="property"
column="INFORMER_ID"
foreign-key="fk_activity_informer"
/>
<property
name="targetType"
type="com.siemens.swa.dao.ActivityTargetTypeUserType"
update="true"
insert="true"
access="property"
column="target_id"
/>
<many-to-one
name="activityLocalInfo"
class="com.siemens.swa.domain.ActivityLocalInfo"
cascade="all"
outer-join="auto"
update="true"
insert="true"
access="property"
column="LOCAL_INFO_ID"
foreign-key="fk_activity_activitylocalinfo"
/>
<many-to-one
name="activityEquipmentInfo"
class="com.siemens.swa.domain.ActivityEquipmentInfo"
cascade="all"
outer-join="auto"
update="true"
insert="true"
access="property"
column="ACT_EQUIP_INFO_ID"
foreign-key="fk_activity_activityequipmentinfo"
/>
<property
name="associatedDocument"
type="java.lang.String"
update="true"
insert="true"
access="property"
column="assoc_doc"
/>
<property
name="freeDescription"
type="java.lang.String"
update="true"
insert="true"
access="property"
column="free_desc"
/>
<many-to-one
name="techniqueAreaRamification"
class="com.siemens.swa.domain.TechniqueAreaRamification"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="TECHN_AREA_RAMIF_ID"
foreign-key="fk_activity_techniquearearamification"
/>
<many-to-one
name="clientInfo"
class="com.siemens.swa.domain.ActivityClientInfo"
cascade="all"
outer-join="auto"
update="true"
insert="true"
access="property"
column="ACT_CLIENT_INFO_ID"
foreign-key="fk_activity_activityclientinfo"
/>
<property
name="initialInterruptOfServiceDate"
column="initial_interrupt_date"
/>
<property
name="initialInterruptOfServiceTime"
column="initial_interrupt_time"
/>
<many-to-one
name="externalInfo"
class="com.siemens.swa.domain.ExternalInfo"
cascade="all"
outer-join="auto"
update="true"
insert="true"
access="property"
column="EXTERNAL_INFO_ID"
foreign-key="fk_activity_externalinfo"
/>
<many-to-one
name="category"
class="com.siemens.swa.domain.ActivityCategory"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="CATEGORY_ID"
foreign-key="fk_activity_activitycategory"
/>
<many-to-one
name="corretiveInfo"
class="com.siemens.swa.domain.CorretiveInfo"
cascade="all"
outer-join="auto"
update="true"
insert="true"
access="property"
column="CORRETIVE_INFO_ID"
foreign-key="fk_activity_correctiveinfo"
/>
<many-to-one
name="reserver"
class="com.siemens.swa.domain.User"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="RESERVER_ID"
/>
<property
name="reserved"
type="java.lang.Boolean"
update="true"
insert="true"
not-null="true"
access="property"
column="RESERVED"
/>
<set
name="technicians"
table="TECHNICIAN_ACTIVITY"
cascade="save-update"
sort="unsorted"
>
<key
column="ACTIVITY_ID"
>
</key>
<many-to-many
class="com.siemens.swa.domain.Technician"
column="tcn_id"
outer-join="auto"
/>
</set>
</class>
</hibernate-mapping>
The Association that is lazy, and therefore throwing:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping
>
<class
name="com.siemens.swa.domain.ActivityExecution"
table="ACTIVITY_EXECUTION"
optimistic-lock="version"
>
<id
name="id"
column="ACT_EXECUTION_ID"
type="java.lang.Long"
>
<generator class="native"/>
</id>
<property
name="date"
column="DATE"
/>
<property
name="time"
column="TIME"
/>
<many-to-one
name="technician"
class="com.siemens.swa.domain.Technician"
cascade="none"
outer-join="auto"
access="property"
foreign-key="fk_activityexecution_technician"
column="TECHNICIAN_ID"
unique="false"
/>
<many-to-one
name="dispatcher"
class="com.siemens.swa.domain.Dispatcher"
cascade="none"
outer-join="auto"
access="property"
column="DISPATCHER_ID"
unique="false"
foreign-key="fk_activityexecution_dispatcher"
/>
<property
name="status"
type="com.siemens.swa.dao.ActivityExecutionStatusUserType"
update="true"
insert="true"
access="property"
column="STATUS"
not-null="true"
/>
<set
name="stateLog"
lazy="false"
cascade="all"
order-by="DATE ASC"
sort="unsorted"
>
<key
column="ACT_EXECUTION_ID"
>
</key>
<one-to-many
class="com.siemens.swa.domain.ActivityStateLog"
/>
</set>
<list name="tracks" lazy="false" table="TRACK_EXECUTION_INFO" cascade="all">
<key column="ACT_EXECUTION_ID"/>
<index column="TRK_EXEC_ORDER"></index>
<composite-element class="com.siemens.swa.domain.TrackingExecutionInfo">
<parent name="activityExecution"/>
<many-to-one name="trackingExecution"
class="com.siemens.swa.domain.TrackingExecution"
cascade="all"
column="TRK_EXECUTION_ID"
not-null="false"/>
<many-to-one name="executionClosing"
class="com.siemens.swa.domain.ExecutionClosing"
cascade="all"
column="EXEC_CLOSING_ID"
not-null="false"/>
</composite-element>
</list>
</class>
</hibernate-mapping>
Relevant part of serviceContext.xml - its a big app:
CODE:
<!-- BASIC SERVICE -->
<bean id="basicService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property
name="transactionManager"><ref
bean="myTransactionManager"/></property>
<property name="target"><ref
bean="basicServ"/></property>
<property
name="transactionAttributes">
<props>
<prop
key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop
key="create">PROPAGATION_REQUIRED</prop>
<prop
key="update">PROPAGATION_REQUIRED</prop>
<prop
key="remove">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- Implementação do Service para Basic -->
<bean id="basicServ"
class="com.siemens.swa.service.BasicServiceImpl">
<property name="basicDAO"><ref
bean="basicDAO"/></property>
</bean>
From applicationContext.xml
CODE:
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory"><ref
local="mySessionFactory"/></property>
</bean>
web.xml
CODE:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,
Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp">
<filter>
<filter-name>hibernate</filter-name>
<filter-class>com.siemens.swa.util.persistence.HibernateSessionFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernate</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>hibernate</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.siemens.swa.session.SessionListener</listener-class>
</listener>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>definitions-config</param-name>
<param-value>/WEB-INF/tiles-defs.xml</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml
</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>validate</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Inicializando o BeanFactory -->
<servlet>
<servlet-name>ObjectFactoryServlet</servlet-name>
<servlet-class>com.siemens.swa.util.support.ObjectFactoryServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>protected/index.html</welcome-file>
<welcome-file>protected/index.htm</welcome-file>
<welcome-file>protected/index.jsp</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
<error-page>
<error-code>500</error-code>
<location>/protected/openError.jsp</location>
</error-page>
<taglib>
<taglib-uri>/WEB-INF/tld/webmenu.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/webmenu.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-bean-el.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-bean-el.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-html-el.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-html-el.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-logic-el.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-logic-el.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-nested.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-template.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-template.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/c.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/swa.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/swa.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://jakarta.apache.org/taglibs/datagrid-1.0</taglib-uri>
<taglib-location>/WEB-INF/tld/taglibs-datagrid.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/functions</taglib-uri>
<taglib-location>/WEB-INF/tld/fn.tld</taglib-location>
</taglib>
<!-- Arquivo de mensagens p/ internacionalizacao-->
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>ApplicationResources</param-value>
</context-param>
<context-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</context-param>
</web-app>
Code between sessionFactory.openSession() and session.close():
using Spring's OpenSessionInViewFilter:
public class HibernateSessionFilter extends OpenSessionInViewFilter
implements Filter, Logable {
protected Session getSession(SessionFactory sessionFactory)
throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.AUTO);
return session;
}
protected void closeSession(Session session, SessionFactory sessionFactory) {
if (session != null && session.isOpen() && session.isConnected()) {
try {
session.flush();
} catch (HibernateException e) {
throw new RuntimeException("Failed to flush session before close: " + e.getMessage(), e);
}
}
super.closeSession(session, sessionFactory);
}
}
My DAO Code:
public class BasicDAOImpl extends HibernateDaoSupport implements BasicDAO {
...
public Object findById(Class entityClass, Long id) {
System.out.println("isAllowCreate: "+ getHibernateTemplate().isAllowCreate());
try {
SessionFactory sf = getHibernateTemplate().getSessionFactory();
Session session = getSession();
Object result = getHibernateTemplate().get(entityClass, id);
return result;
}
catch (Exception e) {System.out.println(e.getStackTrace()); }
return null;
}
}
Exception occurs here in Struts Action:
List tracks = new ArrayList();
if (activity.getActivityExecution() != null) {
tracks = activity.getActivityExecution().getTracks();
}
Full stack trace of any exception that occurs:
May 12, 2005 7:54:14 AM net.sf.hibernate.proxy.LazyInitializer initializeWrapExceptions
SEVERE: Exception initializing proxy
net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed
at net.sf.hibernate.proxy.LazyInitializer.initialize(LazyInitializer.java:47)
at net.sf.hibernate.proxy.LazyInitializer.initializeWrapExceptions(LazyInitializer.java:60)
at net.sf.hibernate.proxy.LazyInitializer.getImplementation(LazyInitializer.java:164)
at net.sf.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:108)
at com.siemens.swa.domain.ActivityExecution$$EnhancerByCGLIB$$eb27eb0f.getTracks(<generated>)
at com.siemens.swa.action.TrackingExecutionOperationAction.openMainPage(TrackingExecutionOperationAction.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:276)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:196)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:105)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:171)
at com.siemens.swa.util.persistence.HibernateSessionFilter.doFilterInternal(HibernateSessionFilter.java:98)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
at java.lang.Thread.run(Thread.java:534)
Name and version of the database you are using:
mysql 4.1
The generated SQL (show_sql=true):
N/A
Debug level Hibernate log excerpt:
unknown
Hi all,
I'm getting LazyInitializationException, though the session should be open via ThreadLocal and OpenSessionInViewFilter. My questions are:
1) I'm seeing different TimeStamps - using a debugger - on the session in the filter and in the DAO. Is that an absolute indication of different objects, or is there a better way to tell? The above code prints true on isAllowCreate in the DAO, not sure if that is relevant.
2) I seen a post where there were two SessionFactories open. How can I determine if that's my problem?
3) The above stacktrace shows no sign of the filter, is that a good clue that the filter session is not used?
4) The code works fine in my Service Layer, but throws in the Action layer. Given the above configuration, any ideas to try?
Thanks,
iksrazal