2010-03-31 7 views
19

Sie empfehlen, JTA-Transaktionsunterstützung in Java EE-Umgebung zu verwenden.Wie funktioniert die JTA-Unterstützung in Tomcat 6 für Hibernate?

Aber wie konfiguriert man JTA in Tomcat6, damit Hibernate Session es verwenden kann?

Ab Version 3.0.1 hat Hibernate die SessionFactory.getCurrentSession() -Methode hinzugefügt. Anfänglich nahm dies die Verwendung von JTA-Transaktionen an, wobei die JTA-Transaktion sowohl den Umfang als auch den Kontext einer aktuellen Sitzung definierte. Angesichts des Reifegrads der zahlreichen eigenständigen JTA TransactionManager-Implementierungen sollten die meisten, wenn nicht alle Anwendungen die JTA-Transaktionsverwaltung verwenden, unabhängig davon, ob sie in einem J2EE-Container bereitgestellt werden oder nicht. Auf dieser Grundlage können Sie nur die JTA-basierten kontextabhängigen Sitzungen verwenden.

+2

brauchst du wirklich JTA? – Bozho

+0

Ok, ich brauche eine JNDI konfigurierte SessionFactory. Wenn ich nun eine SessionFactory durchsehen kann, muss ich JTA konfigurieren. Meine Home-Klassen verwenden getCurrentSession() und wie ich in der Dokumentation lesen kann, funktioniert dies nur in einer JTA-konfigurierten Umgebung. Wie bereits erwähnt, empfiehlt praktisch jeder, JTA in einer JEE-Umgebung zu verwenden. – EugeneP

+3

Verwenden Sie JTA nicht, nur weil jemand Ihnen gesagt hat, dass Sie es brauchen. JTA ist sehr komplex und in 99% der Fälle unnötig. Hibernate/JPA funktioniert ohne es gut. – skaffman

Antwort

28

Wenn Sie JTA-Unterstützung möchten in Tomcat Sie einen eigenständigen Transaktionsmanager wie Atomikos verwenden müssen, JOTM, Bitronix, SimpleJTA, JBossTS oder GeronimoTM/Jencks. Aber ehrlich gesagt, wenn Sie keine Transaktionen über mehrere Ressourcen abwickeln, können Sie ohne JTA leben (und wenn Sie wirklich JTA benötigen, verwenden Sie einen vollwertigen Anwendungsserver).

6

Wenn Sie nur wollen, verwenden SessionFactory.getCurrentSession() Sie die folgenden zwei Zeilen zu Ihrem hibernate.cfg.xml nur hinzufügen:

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

Dies wird Ihnen für jeden Thread eine eindeutige Session geben. Da eine Servlet-Anfrage immer innerhalb eines Threads abgewickelt wird (da Ihr Code keine neuen erzeugt), wird die Sitzung für die gesamte Anfrage ausgeführt.

Vergessen Sie nicht, einen Filter zu verwenden, um die Sitzung nach der Anfrage zu schließen!