2012-02-08 12 views
7

¿Qué pasó con el método SessionFactoryUtils.getSession de Hibernate 4 en Spring 3.1.0? ¿Qué debería usarse en su lugar? sessionFactory.getCurrentSession() me sigue dando esta excepción:Spring: ¿Por qué la clase SessionFactoryUtils en Hibernate 4 no proporciona el método getSession?

org.hibernate.HibernateException: No Session found for current thread 
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:883) 

¿Alguna pista?

+1

Me enfrenta el mismo problema, estoy utilizando sessionFactory.getCurrentSession() en su lugar, pero no estoy seguro si es el camino correcto a seguir. – craftsman

Respuesta

0

No estoy seguro de por qué lo eliminaron, probablemente implementaron un mejor diseño usando org.hibernate.context.CurrentSessionContext. A partir this post:

... Sólo tiene que utilizar la SessionFactory simple y utilizar el método getCurrentSession para obtener la sesión transaccional actual (no utilice openSession !!!!) y que son buenos para ir .. .

a partir documentation of SessionFactory.getCurrentSession():

The definition of what exactly "current" means controlled by the CurrentSessionContext impl configured for use. 
+0

en la publicación de la marta, la palabra clave es "sesión * actual * transaccional". Entonces, Gastaldi debe establecer la demarcación transaccional como describo en mi respuesta –

0

El 'org.hibernate.HibernateException: No Session found for current thread' excepción ocurre cuando no se ha configurado el demarcat transacción ion correctamente con Spring.

Normalmente, Spring abre una sesión para usted cuando se inicia su transacción, lo vincula a un ThreadLocal y lo vuelve a utilizar durante la transacción. Cuando su transacción se compromete, la sesión se cierra (después de que se vació). Por lo tanto, no necesita hacer llamadas a la clase SessionFactory usted mismo.

Normalmente, las personas ponen @Transactional en una clase (normalmente un servicio) y configure Spring to start and end transactions on method invocations en esa clase.

0

hay que añadir un ejemplo de propiedad:

<prop key="hibernate.current_session_context_class">thread</prop>

a su asignación de frijol fábrica de sesiones. (Consulte la documentación de hibernación para más detalles)

3

Uso sessionFactory.getCurrentSession()

creo que el concepto de una "sesión actual" vino en Hibernate 3, SessionFactoryUtil fue escrito antes de que esto existía.

Cuestiones relacionadas