java - example - Spring 3.1, Hibernate 4, SessionFactory
spring hibernate tutorial (6)
Creo que deberías usar org.springframework.orm.hibernate4.LocalSessionFactoryBean
lugar de org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
De LocalSessionFactoryBean
javadoc:
NOTA: Esta variante de LocalSessionFactoryBean requiere Hibernate 4.0 o superior. Es similar en función a la clase del mismo nombre en el paquete orm.hibernate3. Sin embargo, en la práctica, está más cerca de AnnotationSessionFactoryBean ya que su propósito principal es arrancar una SessionFactory desde el análisis de anotaciones.
Esto estaba funcionando:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
pero la actualización a las versiones mencionadas lo rompe. ¿Cuál es el método correcto para crear un bean SessionFactory con Spring 3.1.Release e Hibernate 4.0.0.FINAL ?
El error en la implementación es:
la excepción anidada es java.lang.NoClassDefFoundError: Lorg / hibernate / cache / CacheProvider;
EDITAR
He agregado mi propia respuesta, que me solucionó.
Hibernate 4 ha eliminado las clases y las interfaces relacionadas con CacheProvider
desuso a favor de la interfaz de caché relacionada con RegionFactory
lanzada anteriormente. here puede encontrar el resumen del paquete de caché de la versión 4, here resumen del paquete de caché de la versión 3.2 (justo antes de RegionFactory
interfaz de RegionFactory
) y el resumen del paquete de caché de la versión 3.3 here (cuando se lanzó por primera vez RegionFactory
).
Además de JavaDoc, puede encontrar útil la siguiente documentación:
- Usar JBoss Cache como memoria caché de segundo nivel de Hibernate - Capítulo 5. Arquitectura
- Caché de segundo nivel Ehcache Hibernate
- Hibernate 4 - El segundo nivel de caché
Sin embargo, en base a las dependencies Spring 3.1 Spring 3.1 no requiere Hibernate 4 (en la sección Full Dependencies
, JBoss Hibernate Object-Relational Mapper
está en la versión 3.3.2.GA
). Si desea actualizar a Hibernate 4, deberá actualizar su configuración de caché. De lo contrario, intente utilizar la versión 3.X de Hibernate 3.3.2 o superior.
ACTUALIZACIÓN : tenga en cuenta que la documentación de Hibernate 4 en Spring 3.1 es actualmente escasa. La Spring Framework Reference Documentation
solo tiene lo siguiente para Soporte para Hibernate 4.x :
See Javadoc for classes within the new org.springframework.orm.hibernate4 package
Spring 3.1 introduce LocalSessionFactoryBuilder
, que amplía la Configuration
de Hibernate.
Parece que deberías estar atento a otros cambios si quieres usar Hibernate 4.
ACTUALIZACIÓN 2 : Acaba de notar que esta pregunta es un duplicado cercano de Exception NoClassDefFoundError para CacheProvider .
Spring 3.1 e Hibernate 4 no son compatibles de muchas maneras. Consulte la siguiente Spring JIRA https://jira.springsource.org/browse/SPR-9365
Tuve que cambiar un par de cosas, aquí vamos:
En mi administrador de transacciones, la configuración cambió 3 -> 4:
org.springframework.orm.hibernate4.HibernateTransactionManager;
Y mi sessionFactory a esto (gracias @toxin):
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
Usa esta configuración
archivo de configuración de hibernación:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
POM:
<!-- CGLIB -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>${cglib-version}</version>
<scope>runtime</scope>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${org.hibernate-version}</version>
<!-- will come with Hibernate core -->
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
olvidé incluir las versiones, estoy usando la versión hibernate: 4.1.2.Final y versión de primavera: 3.1.1.RELEASE, hay una actualización de hibernate 4.1.3.Final, no probado, pero creo que funcionará bien.
- En el caso de Hibernate 4.0 o superior, a partir de Spring 4.0, debe usar
org.springframework.orm.hibernate4.LocalSessionFactoryBean
Por ejemplo:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
...
</bean>
- En el caso de Hibernate 5.0 / 5.1 / 5.2, a partir de Spring 4.3, mejor debería usar
org.springframework.orm.hibernate5.LocalSessionFactoryBean