2012-01-15 10 views
10

Tengo problemas para actualizar de hibernación 3.6 a 4.0.1 (primavera de 3 a 3.1).HibernateInterceptor con resorte 3.1 e hibernación 4.01

Estoy utilizando hibernateinterceptors para inyectar la sesión al llamar a algunos métodos (por ejemplo, una llamada OnMessage, el actualizador Cron, etc.) y el interceptor OpennSessionInView para las solicitudes web. Ha funcionado bien con hib 3.6 y spring 3.0, pero a partir de hibernate4 no puedo hacer que funcione. El hibernateInterceptor solo está disponible en el paquete hibernate3 y usarlo no lo hará funcionar

¿Alguna idea de lo que debo hacer?

Al eliminar el interceptor, puedo comenzar, pero una vez que intento llamar a los dao desde una solicitud que no proviene de la web, recibo "No hay excepción de límite de sesión".

¿Hay una mejor manera de interceptar el dao que usar el interceptor de hibernación o debería usar otra técnica? Como dije, estoy usando los dao's de las solicitudes web (que se manejan bien con opensessioninview), JMS OnMessage y SpringCron y en el código de inicialización que no funciona.

Aquí está la configuración básica para la DAO

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
    http://www.springframework.org/schema/jms 
    http://www.springframework.org/schema/jms/spring-jms-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/jee 
     http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
     http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

<bean id="someDao" class="org.springframework.aop.framework.ProxyFactoryBean" 
    p:target-ref="someDaoTarget" p:proxyInterfaces="com.xxxx.MediaDataDao" 
    p:interceptorNames="hibernateInterceptor" /> 

<bean id="someDaoTarget" class="com.xxxx.SomeDaoImpl" 
    p:sessionFactory-ref="sessionFactory" /> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<bean id="transactionManager" 
class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
<property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="hibernateInterceptor" 
    class="org.springframework.orm.hibernate3.HibernateInterceptor" 
    p:sessionFactory-ref="sessionFactory" /> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
    destroy-method="destroy" 
    p:dataSource-ref="dataSource"> 
    <property name="packagesToScan" 
value="com.xxxx" /> 
    <property name="hibernateProperties" ref="hibernateProperties" /> 
</bean> 

<util:properties id="hibernateProperties"> 
<prop key="hibernate.hbm2dll.auto">update</prop> 
<prop key="hibernate.connection.autocommit">false</prop> 
<prop key="hibernate.show_sql">true</prop> 
<prop key="hibernate.format_sql">false</prop> 
<prop key="hibernate.jdbc.batch_size">500</prop> 
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
<prop key="javax.persistence.validation.mode">callback</prop> 
</util:properties> 

excepción iniciada cuando se utiliza el interceptor de hibernación es:

Caused by: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session; 
at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:322) 
at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:233) 
at org.springframework.orm.hibernate3.HibernateInterceptor.getSession(HibernateInterceptor.java:145) 
at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:90) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
at $Proxy37.getAll(Unknown Source) 

O muchos esto es un error, el clásico. ¿La sesión existe en Hibernate 4?

La excepción se produce desde dentro de un constructor de una clase que intenta acceder a un dao. Esto funcionaba perfectamente con hibernate 3.6, pero después de la actualización no puedo hacer que esto funcione.

Respuesta

3

Si está utilizando 4.x de hibernación en primavera 3.1 o 4.x se debe utilizar clases de paquete org.springframework.orm.hibernate4 en lugar de org.springframework.orm.hibernate3

HibernateInterceptor ya no se utiliza antes. Debe usar org.springframework.orm.hibernate4.support.OpenSessionInterceptor