2013-08-01 22 views
16

Ero abituato a getHibernateTemplate() in Hibernate 3, e ora mi sto muovendo per Hibernate 4 e qui non ho trovato seguente classe:Perché HibernateTemplate non è raccomandato?

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

E qui avevo letto su di esso non è più consigliato utilizzare

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

qualcuno mi può spiegare perché? e in Hibernate 4 ora ho bisogno di fare tutte le attività come il commit, la chiusura, lo svuotamento della transazione che è stata automaticamente gestita dal metodo getHibernateTemplate()?

+0

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

risposta

37

Poiché il suo obiettivo principale era ottenere una sessione di sospensione legata alla transazione Spring corrente, quando SessionFactory.getCurrentSession() non esisteva. Poiché ora esiste (e per molto tempo: l'utilizzo di HibenateTemplate è sconsigliato anche nel pacchetto hibernate3), non c'è motivo di usare questa classe specifica di Spring invece di usare SessionFactory.getCurrentSession() per ottenere una sessione legata alla transazione Spring corrente.

Se si utilizza Spring, è necessario utilizzare la sua gestione dichiarativa delle transazioni, che consente di evitare l'apertura, il commit, la chiusura e lo scarico. E 'tutto fatto da molla automaticamente:

@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.) 
} 

Nell'esempio precedente, viene avviata una transazione (se non è già avviato) prima della chiamata di metodo; Una sessione verrà creata da Spring per la transazione e la sessione verrà automaticamente svuotata prima del commit della transazione, che verrà eseguita automaticamente da Spring quando il metodo ritorna.

+0

E il caso di query? Devo aggiungere @Transactional sui metodi di query? – Hippoom

+0

Sì. Ogni interazione con Hibernate dovrebbe essere eseguita in una transazione. –

+0

se otteniamo una sessione usando sessionFactory.getCurrentSession(), dovremmo chiudere la sessione (session.close()) una volta eseguita la query? o lo farà automaticamente entro la primavera. – user1919581

Problemi correlati