2012-02-08 11 views
7

Cosa è successo al metodo SessionFactoryUtils.getSession di Hibernate 4 in Spring 3.1.0? Cosa dovrebbe invece essere usato? sessionFactory.getCurrentSession() continua a darmi questa eccezione:Spring: Perché la classe SessionFactoryUtils in Hibernate 4 non fornisce il metodo getSession?

org.hibernate.HibernateException: No Session found for current thread 
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:883) 

Qualche suggerimento?

+1

Sto affrontando lo stesso problema, sto usando sessionFactory.getCurrentSession() invece, ma non sono sicuro se è la strada giusta da percorrere. – craftsman

risposta

0

Non sicuro perché lo hanno rimosso, probabilmente hanno implementato un design migliore utilizzando org.hibernate.context.CurrentSessionContext. A partire dal this post:

... È sufficiente utilizzare il SessionFactory pianura e utilizzare il metodo getCurrentSession per ottenere la sessione transazionale corrente (non usare openSession !!!!) e si è pronti per partire .. .

partire dal documentation of SessionFactory.getCurrentSession():

The definition of what exactly "current" means controlled by the CurrentSessionContext impl configured for use. 
+0

nel post di martora, la parola chiave è "current * transactional * session". Quindi, gastaldi deve stabilire una demarcazione transazionale come descritto nella mia risposta –

0

Il 'org.hibernate.HibernateException: No Session found for current thread' eccezione accade quando non si è configurato il demarcat transazione ion correttamente con Spring.

In genere, Spring apre una sessione al momento dell'avvio della transazione, la associa a un ThreadLocal e la riutilizza per la durata della transazione. Quando la transazione viene eseguita, la sessione viene chiusa (dopo che è stata scaricata). Pertanto, non è necessario effettuare chiamate alla classe SessionFactory.

Di solito, le persone mettono @Transactional su una classe (in genere un Servizio) e su configure Spring to start and end transactions on method invocations in quella classe.

0

si deve aggiungere un esempio di proprietà:

<prop key="hibernate.current_session_context_class">thread</prop>

per la mappatura di fagioli fabbrica di sessione. (Controllare la documentazione di ibernazione per maggiori dettagli)

3

Usa sessionFactory.getCurrentSession()

Credo che il concetto di "sessione corrente" venuto in Hibernate 3, SessionFactoryUtil è stato scritto prima di questo esistesse.