tutorial example java hibernate

java - example - hibernate jpa



Hibernate openSession() vs getCurrentSession() (4)

Tengo algunas preguntas sobre el uso de Hibernate en la aplicación web JSP.

  1. ¿Cuál debería ser el valor de hibernate.current_session_context_class ?

  2. Entonces, ¿cuál de las siguientes afirmaciones debería usarse? ¿Y por qué?

    Session s = HibernateUtil.getSessionFactory().openSession(); Session s = HibernateUtil.getSessionFactory().getCurrentSession()

  3. Por último, ¿cuál es mejor "una sesión por aplicación web" o "una sesión por solicitud"?


Como se explica en esta post en el foro, 1 y 2 están relacionados. Si configura hibernate.current_session_context_class para el subproceso y luego implementa algo como un filtro de servlet que abre la sesión, entonces puede acceder a esa sesión en cualquier otro lugar utilizando SessionFactory.getCurrentSession() .

SessionFactory.openSession() siempre abre una nueva sesión que debe cerrar una vez que haya terminado con las operaciones. SessionFactory.getCurrentSession() devuelve una sesión vinculada a un contexto; no es necesario que cierre esto.

Si está utilizando Spring o EJB para administrar transacciones, puede configurarlos para abrir / cerrar sesiones junto con las transacciones.

Nunca debe usar one session per web app ; la sesión no es un objeto seguro para subprocesos; no puede ser compartida por varios subprocesos. Siempre debe usar "una sesión por solicitud" o "una sesión por transacción"


SessionFactory: "One SessionFactory por aplicación por DataBase" (por ejemplo, si usa 3 DataBase en nuestra aplicación, necesita crear objeto sessionFactory por cada DB, debe crear 3 SessionFactorys por completo, o si solo tiene una sessionBase de DataBase One es suficiente ).

Sesión: "Una sesión para un ciclo de solicitud-respuesta". puede abrir la sesión cuando llega la solicitud y puede cerrar la sesión después de completar el proceso de solicitud. Nota: -No use una sesión para la aplicación web.


Si hablamos de SessionFactory.openSession ()

  • Siempre crea un nuevo objeto de sesión.
  • Debe vaciar y cerrar explícitamente los objetos de sesión.
  • En un entorno de subproceso único, es más lento que getCurrentSession.
  • No necesita configurar ninguna propiedad para llamar a este método.

Y si hablamos de SessionFactory.getCurrentSession ()

  • Crea una nueva sesión si no existe, sino utiliza la misma sesión que está en el contexto de hibernación actual.
  • No necesita descargar y cerrar objetos de sesión, Hibernate lo cuidará automáticamente de forma interna.
  • En el entorno de un solo hilo, es más rápido que openSession.
  • Necesita configurar propiedad adicional. "hibernate.current_session_context_class" para llamar al método getCurrentSession, de lo contrario generará una excepción.

openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you.

Debe vaciar y cerrar explícitamente estos objetos de sesión. Como los objetos de sesión no son seguros para subprocesos, debe crear un objeto de sesión por solicitud en un entorno multiproceso y una sesión por solicitud en las aplicaciones web también.

getCurrentSession :- When you call SessionFactory. getCurrentSession, it will provide you session object which is in hibernate context and managed by hibernate internally. It is bound to transaction scope. When you call SessionFactory. getCurrentSession , it creates a new Session if not exists , else use same session which is in current hibernate context. It automatically flush and close session when transaction ends, so you do not need to do externally. If you are using hibernate in single threaded environment , you can use getCurrentSession, as it is faster in performance as compare to creating new session each time. You need to add following property to hibernate.cfg.xml to use getCurrentSession method. <session-factory> <!-- Put other elements here --> <property name="hibernate.current_session_context_class"> thread </property> </session-factory>