2012-04-09 18 views
18

Hibernate Sono un po 'confuso tra i due. Come da So entrambe le dichiarazioni vanno in letargo sessione, SessionFactory.getCurrentSession() restituisce una sessione contestuale in base alla proprietà <property name="current_session_context_class"> che si trova in hibernate.cfg.xml Non dovremmo sempre andare con questo approccio?Differenza b/n Sessionfactory.getCurrentSession() e SessionFactory.openSession()

Quale valore aggiuntivo viene aggiunto da SessionFactory.openSession()?

risposta

37

Una sessione viene aperta ogni volta che sf.getCurrentSession() viene chiamato per la prima volta. Questo crea una nuova sessione se non ne esiste una o ne esiste una esistente se ne esiste già una.

In Tomcat questo associa una sessione con un thread che viene creato utilizzando l'oggetto ThreadLocal sottostante. Ma poiché Tomcat utilizza il pool di thread è del tutto possibile che una richiesta possa ricevere un thread con una sessione già associata ad esso, introducendo così la possibilità di non creare nemmeno una nuova sessione. Un'altra cosa è che la sessione che hai ottenuto con sf.getCurrentSession() viene svuotata e chiusa automaticamente.

Il metodo sf.openSession() crea invece una nuova sessione ma non tenta di associarlo a un thread. Ma ricorda che sf.openSession() introduce un altro intoppo in quanto si aspetta che gli utenti gestiscano la chiusura e lo svuotamento delle sessioni, invece di lasciare che Hibernate lo faccia automaticamente per noi.

sf.getCurrentSession() è in genere sufficiente. sf.openSession() fornisce e facilita un livello superiore di gestione del luogo in cui la sessione viene archiviata e gestita. È certamente un'opzione avanzata.

+1

Significa che se sto usando sf.getCurrentSession per i multithread all'interno di tomcat, userà la stessa sessione? va bene? – Dejell