2013-08-01 13 views
16

Ich wurde getHibernateTemplate() in Hibernate 3, gebraucht und jetzt bewege ich 4 für Hibernate und hier fand ich nicht nach Klasse:Warum HibernateTemplate nicht empfohlen wird?

org.springframework.orm.hibernate4.support.HibernateDaoSupport; 

Und hier ich darüber gelesen hatte, wird nicht mehr empfohlen verwenden

http://forum.springsource.org/showthread.php?117227-Missing-Hibernate-Classes-Interfaces-in-spring-orm-3.1.0.RC1

Kann mir jemand erklären, warum? und in Hibernate 4 werde ich jetzt alle Aufgaben wie commit, schließen, spülen die Transaktion, die automatisch von getHibernateTemplate() -Methode verwaltet wurde?

+0

Siehe http://stackoverflow.com/questions/4067775/spring-hibernate-template-when-to-use-and-why/4067801#4067801 und http://stackoverflow.com/questions/ 5104765/hibernatedaosupport-is-not-recommended-why/5104965 # 5104965 – StormeHawke

Antwort

37

Da sein Hauptziel war, eine Hibernate-Sitzung mit der aktuellen Spring-Transaktion gebunden zu bekommen, wenn SessionFactory.getCurrentSession() nicht vorhanden war. Da es jetzt existiert (und für eine lange Zeit: Die Verwendung von HibenateTemplate wird selbst im Paket hibernate3 nicht empfohlen), gibt es keinen Grund, diese Spring-spezifische Klasse zu verwenden, anstatt SessionFactory.getCurrentSession() zu verwenden, um eine Sitzung mit der aktuellen Spring-Transaktion zu verknüpfen.

Wenn Sie Spring verwenden, sollten Sie die deklarative Transaktionsverwaltung verwenden, mit der Sie das Öffnen, Festschreiben, Schließen und Leeren vermeiden können. Es ist alles von Spring automatisch erledigt:

@Autowired 
private SessionFactory sessionFactory; 

@Transactional 
public void someMethod() { 
    // get the session for the current transaction: 
    Session session = sessionFactory.getCurrentSession(); 
    // do things with the session (queries, merges, persists, etc.) 
} 

Im obigen Beispiel wird eine Transaktion (falls nicht bereits gestartet) vor dem Methodenaufruf gestartet werden; Eine Sitzung wird von Spring für die Transaktion erstellt, und die Sitzung wird vor dem Festschreiben der Transaktion automatisch geleert. Dies geschieht bei der Rückkehr der Methode automatisch durch Spring.

+0

Was ist mit einem Fall? Muss ich @Transactional zu den Abfragemethoden hinzufügen? – Hippoom

+0

Ja. Jede Hibernate-Interaktion sollte in einer Transaktion erfolgen. –

+0

Wenn wir eine Sitzung mit sessionFactory.getCurrentSession() erhalten, müssen wir die Sitzung (session.close()) schließen, sobald die Abfrage ausgeführt wurde? oder es wird automatisch im Frühling gemacht. – user1919581

Verwandte Themen