2010-03-31 24 views
19

Recomiendan utilizar soporte de transacciones JTA en el entorno Java EE.¿Cómo utilizar el soporte JTA en Tomcat 6 para Hibernate?

¿Pero cómo configurar JTA en Tomcat6 para que la sesión de Hibernate pueda usarlo?

A partir de la versión 3.0.1, Hibernate agregó el método SessionFactory.getCurrentSession(). Inicialmente, este uso asumido de transacciones JTA, donde la transacción JTA definió tanto el alcance como el contexto de una sesión actual. Dada la madurez de las numerosas implementaciones JTA independientes de TransactionManager, la mayoría de las aplicaciones, si no todas, deberían usar la gestión de transacciones JTA, independientemente de si están implementadas en un contenedor J2EE. En base a eso, las sesiones contextuales basadas en JTA son todo lo que necesita usar.

+2

¿Realmente necesitas JTA? – Bozho

+0

Ok, necesito una SessionFactory configurada JNDI. Ahora cuando puedo obtener una SessionFactory a través de la búsqueda, necesito configurar JTA. Mis clases particulares usan getCurrentSession() y, como puedo leer en la documentación, esto solo funciona en el entorno configurado de JTA. Además, como ya mencioné, prácticamente todo el mundo recomienda usar JTA en el entorno JEE. – EugeneP

+3

No use JTA solo porque alguien le dijo que lo necesita. JTA es muy complejo e innecesario en el 99% de las situaciones. Hibernate/JPA funcionará bien sin eso. – skaffman

Respuesta

28

Si desea soporte JTA en Tomcat Tendrá que utilizar un gestor de transacciones independiente como Atomikos, JOTM, Bitronix, SimpleJTA, JBossTS o GeronimoTM/Jencks. Pero, sinceramente, si no va a manejar transacciones a través de múltiples recursos, entonces puede vivir sin JTA (y si realmente necesita JTA, use un servidor de aplicaciones completo).

6

Si lo que desea es utilizar SessionFactory.getCurrentSession() puede simplemente añadir las dos líneas siguientes a su hibernate.cfg.xml:

<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
<property name="hibernate.current_session_context_class">thread</property> 

Esto le dará una sesión único para cada hilo. Como una solicitud de servlet siempre se maneja dentro de un hilo (dado que su código no engendra nombres nuevos), la sesión seguirá vigente para toda la solicitud.

¡No olvide utilizar un filtro para cerrar la sesión después de la solicitud!

Cuestiones relacionadas