2012-04-24 10 views
8

Acabo de iniciar un simple proyecto de prueba de Java que gestiona algunas entidades que utilizan Hibernate y proporciona una interfaz REST para manipular estos objetos y proporcionar cierta lógica comercial adicional. La interfaz REST se crea utilizando RESTEasy y Jetty.Crear sesión de hibernación por solicitud

Todo funciona bien hasta el momento, pero tengo la sensación de que estoy escribiendo demasiado código repetitivo. Como no tengo mucha experiencia en estos frameworks de Java, me pregunto si alguien podría darme una pista sobre cómo mejorar la situación.

  1. Creting Hibernate sesiones por Solicitud

Bueno, por lo que yo entendía que tenga que crear una sesión de Hibernate por la petición y al final tengo que cerrarla. Así que actualmente todos mis métodos de servicio tener este aspecto:

Session session = HibernateUtil.getInstance().getSessionFactory().openSession(); 
... 
... 
... 
session.close(); 

¿Hay alguna manera de eliminar estas dos líneas con el fin de hacer de alguna manera esto de forma automática? Actualmente mi servicio está registrado como singleton RestEASY. ¿Se solucionará el problema al cambiar a un recurso RESTeasy y al crear la sesión en el constructor? Creo que resolverá el problema de crear la sesión. ¿Pero dónde cerrarlo?

En C++, esto se puede hacer fácilmente creando un objeto de ámbito que cierra la sesión al final. Pero en Java?

  1. Cuando se realiza una solicitud REST de este tipo, debo verificar si hay una sesión válida (el usuario debe iniciar sesión previamente). ¿Es un ServletFilter el camino correcto para hacer esto?

General: ¿Hay algún otro patrón o estructura que deba considerar usar? Quiero decir que quiero que sea lo más simple posible, y sobre todo porque no tengo tanta experiencia, no quiero terminar usando Spring o cualquier framework de peso pesado. Parece que estoy acostumbrado a la simplicidad de Python y Django, pero para este pequeño proyecto tengo que usar Java.

¡Hasta ahora!

Respuesta

3

enfoque recomendado actual de Hibernate para la gestión de sesiones es detallada en este wiki page. En particular, creo que debe leer el último párrafo: This is all very difficult, can't this be done easier?

Al final, necesita decirle a la capa de persistencia que "estoy a punto de hacer algo" (que generalmente también hace que la sesión lo haga) con) y "ya terminé de hacerlo". Puede hacerlo con annotations, o JTA transactions, ¡pero esa información aún debe ser comunicada!

0

Debería intentar escribir un filtro que lo haga. Spring's OpenSessionInViewFilter es un buen lugar para comenzar si necesita un ejemplo.

1

Inyecte SessionFactory en su objeto de acceso a datos y use sessionFactory.getCurrentSession() para acceder al objeto de sesión de Hibernate. puede hacer uso de cualquiera de las clases de fábrica disponibles para implementar esta ..

A continuación, el código debería tener este aspecto ..

sessionFactory.getCurrentSession().save(newInstance); 
+6

Bien, pero ¿dónde cierro la sesión? – duselbaer

+1

En el caso de struts2, puede usar interceptores para inicializar y cerrar el objeto de sesión. –

Cuestiones relacionadas