2010-03-31 16 views
19

Si consiglia di utilizzare il supporto per le transazioni JTA nell'ambiente Java EE.Come utilizzare il supporto JTA in Tomcat 6 per Hibernate?

Ma come configurare JTA in Tomcat6 in modo che Hibernate Session possa usarlo?

A partire dalla versione 3.0.1, Hibernate ha aggiunto il metodo SessionFactory.getCurrentSession(). Inizialmente, questo presupponeva l'utilizzo di transazioni JTA, in cui la transazione JTA definiva sia l'ambito che il contesto di una sessione corrente. Data la maturità delle numerose implementazioni di TransactionManager JTA standalone, la maggior parte, se non tutte, le applicazioni dovrebbero utilizzare la gestione delle transazioni JTA, indipendentemente dal fatto che siano implementate o meno in un contenitore J2EE. Sulla base di ciò, le sessioni contestuali basate su JTA sono tutto ciò che devi usare.

+2

hai davvero bisogno di JTA? – Bozho

+0

Ok, ho bisogno di una SessionFactory configurata con JNDI. Ora, quando sono in grado di ottenere una SessionFactory tramite la ricerca, devo configurare JTA. Le mie classi home utilizzano getCurrentSession() e, come posso leggere nella documentazione, funziona solo in ambiente configurato JTA. Inoltre, come ho già detto, praticamente tutti raccomandano l'uso di JTA nell'ambiente JEE. – EugeneP

+3

Non utilizzare JTA solo perché qualcuno ti ha detto che ne hai bisogno. JTA è molto complessa e non necessaria nel 99% delle situazioni. Hibernate/JPA funzionerà perfettamente senza di esso. – skaffman

risposta

28

Se si desidera il supporto JTA in Tomcat avrete bisogno di utilizzare un gestore di transazioni standalone come Atomikos, JOTM, Bitronix, SimpleJTA, JBossTS o GeronimoTM/Jencks. Ma onestamente, se non gestirai transazioni su più risorse, potrai vivere senza JTA (e se hai davvero bisogno di JTA, usa un server di applicazioni completo).

6

Se si desidera utilizzare SessionFactory.getCurrentSession() si può semplicemente aggiungere le seguenti due righe al hibernate.cfg.xml:

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

questo vi darà una sessione unica per ciascun thread. Poiché una richiesta servlet viene sempre gestita all'interno di un thread (dato che il tuo codice non genera nuovi), la Session vivrà per l'intera richiesta.

Non dimenticare di utilizzare un filtro per chiudere la sessione dopo la richiesta!

Problemi correlati