Arquitectura
Visión General
Una visión a (muy) alto nivel de la arquitectura de Hibernate:
Este diagrama muestra a Hibernate usando la base de datos y los datos de
configuración para proveer servicios de persistencia (y objetos
persistentes) a la aplicación.
Nos gustaría mostrar una vista más detallada de la arquitectura de tiempo
de ejecución. Desafortunadamente, Hibernate es flexible y soporta diferentes
enfoques. Mostraremos los dos extremos. En la arquitectura "sencilla", es la
aplicación la que provee su propias conexiones JDBC y gestiona sus propias
transacciones. Este enfoque usa un mínimo subconjunto de la API de Hibernate:
La arquitectura "full cream" abstrae a la aplicación de las APIs
de JDBC/JTA y deja que Hibernate se encargue de los detalles.
He aquí algunas definiciones de los objetos en los diagramas:
SessionFactory (org.hibernate.SessionFactory)
Caché threadsafe (inmutable) de mapeos compilados para
una sola base de datos. Es una fábrica de Session
y un cliente de ConnectionProvider. Opcionalmente,
puede mantener una caché (de segundo nivel) de datos reusables
entre transacciones, a un nivel de proceso o de cluster.
Session (org.hibernate.Session)
Objeto mono-hebra, de corta vida que representa una conversación
entre la aplicación y el almacenamiento persistente. Envuelve una
conexión JDBC. Es una fábrica de Transaction.
Mantiene una caché requerida (de primer nivel) de objetos persistentes,
usada mientras se navega el grafo de objetos o se recuperen objetos por
identificador.
Objetos y colecciones persistentes
Objetos de corta vida, mono-hebra conteniendo estado persistente y
funciónalidad de negocio. Estos pueden ser JavaBeans/POJOs
(Plain Old Java Objects, o sea, cualquier objeto Java), la única
cosa especial en ellos es que estan asociados actualmente con una
(y sólo una) Session. Tan pronto como la
Session sea cerrada, serán separados y
estarán libres para ser usados en cualquier capa de aplicación.
(por ejemplo, directamente como objetos de transferencia de datos hacia
y desde la capa de presentación).
Objetos y colecciones transitorios y separados
Instancias de clases persistentes que no estan acutualmente asociadas
con una Session. Pueden haber sido instanciadas por
la aplicación y (aún) no haber sido hechas persistentes,
o pueden haber sido instanciadas por una Session cerrada.
Transaction (org.hibernate.Transaction)
(Opcional) Un objeto de corta vida, mono-hebra, usado por la aplicación
para especificar unidades atómicas de trabajo. Abstrae a la aplicación
de las subyacentes transacciones JDBC, JTA o CORBA. En algunos casos, una
Session puede extenderse sobre varias Transactions.
Sin embargo, la demarcación de la transacción, ya sea usando la API
subyacente o Transaction, nunca es opcional!
ConnectionProvider (org.hibernate.connection.ConnectionProvider)
(Opcional) Una fábrica (y pool) de conexiones JDBC. Abstrae a la aplicación
del Datasource o DriverManager subyacente.
No se expone a la aplicación, pero puede ser extendido/implementado por
el desarrollador.
TransactionFactory (org.hibernate.TransactionFactory)
(Opcional) Una fábrica de instancias de Transaction.
No se expone a la aplicación, pero puede ser extendido/implementado por
el desarrollador.
Interfaces de Extensión
Hibernate ofrece muchas interfaces de extensión opcional que puedes
implementar para modificar a medida el comportamiento de tu capa de persistencia.
Para más detalles, mira la documentación de la API.
Dada una arquitectura "sencilla", la aplicación pasa por alto las APIs
de Transaction/TransactionFactory y/o
ConnectionProvider, para hablar directamente a JTA o JDBC.
Estados de instancia
Una instancia de una clase persistente puede estar en uno de tres estados
diferentes, definidos respecto de su contexto de persistencia.
El objeto Session de Hibernate es el contexto de persistencia:
transitorio
La instancia no está y nunca estuvo asociada con
un contexto de persistencia. No tiene identidad persistente
(valor de clave primaria).
persistente
La instancia está actualmente asociada con un
contexto de persistencia. Tiene una identidad persistente
(valor de clave primaria) y, quizás, una fila
correspondiente en la base de datos. Para un contexto de
persistencia en particular, Hibernate garantiza
que la identidad persistente es equivalente a la identidad
Java (localización en memoria del objeto).
separado
La instancia estuvo una vez asociada con un contexto
de persistencia, pero ese contexto fue cerrado, o la
instancia fue serializada a otro proceso. Tiene una
identidad persistente y, quizás, una fila correspondiente
en la base de datos. Para las instancias separadas,
Hibernate no establece ninguna garantía sobre
la relación entre identidad persistente e identidad Java.
Integración JMX
JMX es el estándar J2EE para la gestión de componentes Java. Hibernate
puede ser gestionado por medio de un servicio estándar JMX.
Proveemos una implementación de MBean en la distribución,
org.hibernate.jmx.HibernateService.
Para ejemplo de cómo desplegar Hibernate como un servicio JMX en un Servidor
de Aplicaciones JBoss, por favor, mira la Guía del Usuario de JBoss.
En JBoss AS, tienes además estos beneficios si despliegas usando JMX:
Gestión de Sesión: El ciclo de vida de la Session
de Hibernate puede estar automáticamente ligado al ámbito de una transacción
JTA. Esto significa que ya no tienes que abrir ni cerrar la Session manualmente,
esto pasa a ser trabajo de un interceptor EJB de JBoss. Además tampoco tienes
que preocuparte más de la demarcación de la transacción (a menos que
que quieras escribir una capa de persitencia portable, por supuesto, usa la API de
Transaction de Hibernate para esto). Para acceder a una
Session llama al HibernateContext.
Despliegue de HAR: Usualmente despliegas el servicio JMX de Hibernate
usando un descriptor de despliegue de servicio de JBoss (en un fichero EAR y/o SAR), que soporta
todas las opciones de configuración usuales de una SessionFactory de
Hibernate. Sin embargo, todavía tienes que nombrar todos tus ficheros de mapeo en el
descriptor de despliegue. Si decides usar el depliegue de HAR opcional, JBoss detectará
automáticamente todos los ficheros de mapeo en tu fichero HAR.
Para más información sobre estas opciones, consulta la
Guía de Usuario del JBoss AS.
Otra funcionalidad disponible como un servicio JMX son las estadísticas en
tiempo de ejecución de Hibernate. Mira .
Soporte JCA:
Hiberate puede además ser configurado como un conector JCA. Por favor mira el
sitio web para más detalles. Por favor ten en cuenta que el soporte de JCA
de Hibernate está aún considerado experimental.