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.