Uso de la propiedad current_session_context_class hibernate 3 hibernate 4
Tengo una aplicación con Spring y Hibernate3 funcionando bien en producción. A continuación se muestra la configuración para la fábrica de sesiones en la aplicación de SpringContext.xml
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/hibernate</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.max_fetch_depth">2</prop>
<prop key="hibernate.autocommit">false</prop>
<prop key="hibernate.current_session_context_class ">thread</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
</property>
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean
below) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="count*" propagation="SUPPORTS" read-only="true" />
<tx:method name="validate*" propagation="SUPPORTS"
read-only="true" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="login" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- ensure that the above transactional advice runs for any execution of
an operation defined by the service interfaces -->
<aop:config>
<aop:pointcut id="projectServiceOperation"
expression="execution(* com.service.project.IProjectService.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="projectServiceOperation" />
</aop:config>
Está funcionando bien en la producción.
Ahora para otro proyecto estamos migrando a Hibernate4. Copiamos sobre la misma configuración, excepto que usamos SessionFactory de Hierrnate 4, TransacionManager, etc. del paquete org.springframework.orm.hibernate4. *. Sin embargo, comenzó a dar una excepción que dice "Guardar no es válido sin una transacción activa". Después de buscar un poco, muchas personas parecían haber enfrentado los problemas y varias personas sugirieron no usar
<prop key="hibernate.current_session_context_class ">thread</prop>
Propiedad y funcionó. También funcionó para mí. Toda la poca información que pude obtener de las publicaciones indica que tiene algo que ver con las sesiones contextuales y la estrategia de hilos que interfieren con la estrategia de gestión de sesiones de Spring. Pero no donde pude encontrar ninguna respuesta concreta. Además, ¿por qué funcionó con Hibernate3 y no con Hibernate4? ¿Cuál es la diferencia y qué ha cambiado? Cada otra configuración es la misma. No estoy usando @Transactional sino el modo XML de la vieja escuela.
Can somebody point me to clear explaination for this behavioural difference in Hibernate3 and Hibernate4?