Dobry den,
mam prosbu o pomoc:
Ve svem projektu pouzivam spring (1.2.6) a hibernate (3.1RC1) a
nefunguje mi lazy inicializace mapovanych objektu : tomcat pise
chybu:
failed to lazily initialize a collection of role:
beans.Project.phases, no session or session was closed
konfigurace v msfchecklist-servlet.xml:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"><ref bean="dataSource"
/></property>
<property
name="configLocation"><value>classpath:hibernate.cfg.xml</value></property>
<property
name="configurationClass"><value>org.hibernate.cfg.AnnotationConfiguration</value></property>
<property name="hibernateProperties">
<props>
<prop
key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key=" hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- Transactions -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref
local="sessionFactory" /></property>
</bean>
<bean id="dataStorageTarget" class="
businesslogic.DataStorageFacadeImpl">
<property name="documentDAO" ref="documentDAO" />
<property name="documentInPhaseDAO"
ref="documentInPhaseDAO" />
<property name="documentTypeDAO" ref="documentTypeDAO" />
<property name="phaseDAO" ref="phaseDAO" />
<property name="phaseInProjectDAO" ref="phaseInProjectDAO" />
<property name="projectDAO" ref="projectDAO" />
<property name="projectTypeDAO" ref="projectTypeDAO" />
<property name="roleDAO" ref="roleDAO" />
<property name="roleInProjectDAO" ref="roleInProjectDAO" />
<property name="signDAO" ref="signDAO" />
<property name="signRequestDAO" ref="signRequestDAO" />
<property name="userDAO" ref="userDAO" />
</bean>
<bean id="dataStorage"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref
local="transactionManager" /></property>
<property name="target"><ref local="dataStorageTarget"
/></property>
<property name="transactionAttributeSource">
<bean
class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"
/>
</property>
</bean>
Ve web.xml pouzivam:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>
OpenSessionInViewFilter by mel (podle me) zajistit, ze se bude
pouzivat jedina Session a jedina SessionFactory a cely pozadavek
se bude zpracovavat v jedine transakci.
Bohuzel se z nejakeho duvodu stane, ze hibernate mi session zavre,
takze kdyz pak zpracovavam nactene objekty v kontroleru, lazy
inicializace uz tam nefunguje.
Facada vypada takto:
@Transactional
public interface DataStorageFacade {
// -- Query methods
//
-----------------------------------------------------------------
/**
* Return all projects in the database.
*
* @return all projects in the database.
*/
@Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public List<Project> getAllProjects();
/**
* Return all phases in the database.
*
* @return all phases in the database.
*/
@Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public List<Phase> getAllPhases();
@Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public List<ProjectType> getAllProjectTypes();
atd.
}
Snazil jsem se vysledovat, kde presne se ta session zavre a dosel
jsem tady:
org.springframework.orm.hibernate3.SessionFactoryUtils :
private static void closeSessionOrRegisterDeferredClose(Session
session, SessionFactory sessionFactory) {
Map holderMap = (Map) deferredCloseHolder.get();
if (holderMap != null && sessionFactory != null &&
holderMap.containsKey(sessionFactory)) {
logger.debug("Registering Hibernate Session for
deferred close");
Set sessions = (Set) holderMap.get(sessionFactory);
sessions.add (session);
if (!session.isConnected()) {
// We're running against Hibernate 3.1 RC1, where
Hibernate will
// automatically disconnect the Session after a
transaction.
// We'll reconnect it here, as the Session is
likely gonna be
// used for lazy loading during an "open session
in view" pase.
session.reconnect();
}
}
else {
doClose(session);
}
}
Z nejakeho duvodu je zde holderMap == null, takze se vola
doClose(session) a ta zavre session.
Diky za jakoukoli pomoc.
Standa