280 lines
14 KiB
XML
280 lines
14 KiB
XML
<chapter id="architecture">
|
|
|
|
<title>Arquitectura</title>
|
|
|
|
<sect1 id="architecture-overview" revision="1">
|
|
<title>Visión General</title>
|
|
|
|
<para>
|
|
Una visión a (muy) alto nivel de la arquitectura de Hibernate:
|
|
</para>
|
|
|
|
<mediaobject>
|
|
<imageobject role="fo">
|
|
<imagedata fileref="images/overview.svg" format="SVG" align="center"/>
|
|
</imageobject>
|
|
<imageobject role="html">
|
|
<imagedata fileref="../shared/images/overview.gif" format="GIF" align="center"/>
|
|
</imageobject>
|
|
</mediaobject>
|
|
|
|
<para>
|
|
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.
|
|
</para>
|
|
|
|
<para>
|
|
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:
|
|
</para>
|
|
|
|
<mediaobject>
|
|
<imageobject role="fo">
|
|
<imagedata fileref="images/lite.svg" format="SVG" align="center"/>
|
|
</imageobject>
|
|
<imageobject role="html">
|
|
<imagedata fileref="../shared/images/lite.gif" format="GIF" align="center"/>
|
|
</imageobject>
|
|
</mediaobject>
|
|
|
|
<para>
|
|
La arquitectura "full cream" abstrae a la aplicación de las APIs
|
|
de JDBC/JTA y deja que Hibernate se encargue de los detalles.
|
|
</para>
|
|
|
|
<mediaobject>
|
|
<imageobject role="fo">
|
|
<imagedata fileref="images/full_cream.svg" format="SVG" align="center"/>
|
|
</imageobject>
|
|
<imageobject role="html">
|
|
<imagedata fileref="../shared/images/full_cream.gif" format="GIF" align="center"/>
|
|
</imageobject>
|
|
</mediaobject>
|
|
|
|
<para>
|
|
He aquí algunas definiciones de los objetos en los diagramas:
|
|
<variablelist spacing="compact">
|
|
<varlistentry>
|
|
<term>SessionFactory (<literal>org.hibernate.SessionFactory</literal>)</term>
|
|
<listitem>
|
|
<para>
|
|
Caché threadsafe (inmutable) de mapeos compilados para
|
|
una sola base de datos. Es una fábrica de <literal>Session</literal>
|
|
y un cliente de <literal>ConnectionProvider</literal>. Opcionalmente,
|
|
puede mantener una caché (de segundo nivel) de datos reusables
|
|
entre transacciones, a un nivel de proceso o de cluster.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>Session (<literal>org.hibernate.Session</literal>)</term>
|
|
<listitem>
|
|
<para>
|
|
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 <literal>Transaction</literal>.
|
|
Mantiene una caché requerida (de primer nivel) de objetos persistentes,
|
|
usada mientras se navega el grafo de objetos o se recuperen objetos por
|
|
identificador.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>Objetos y colecciones persistentes</term>
|
|
<listitem>
|
|
<para>
|
|
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) <literal>Session</literal>. Tan pronto como la
|
|
<literal>Session</literal> 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).
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>Objetos y colecciones transitorios y separados</term>
|
|
<listitem>
|
|
<para>
|
|
Instancias de clases persistentes que no estan acutualmente asociadas
|
|
con una <literal>Session</literal>. Pueden haber sido instanciadas por
|
|
la aplicación y (aún) no haber sido hechas persistentes,
|
|
o pueden haber sido instanciadas por una <literal>Session</literal> cerrada.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>Transaction (<literal>org.hibernate.Transaction</literal>)</term>
|
|
<listitem>
|
|
<para>
|
|
(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
|
|
<literal>Session</literal> puede extenderse sobre varias <literal>Transaction</literal>s.
|
|
Sin embargo, la demarcación de la transacción, ya sea usando la API
|
|
subyacente o <literal>Transaction</literal>, nunca es opcional!
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>ConnectionProvider (<literal>org.hibernate.connection.ConnectionProvider</literal>)</term>
|
|
<listitem>
|
|
<para>
|
|
(Opcional) Una fábrica (y pool) de conexiones JDBC. Abstrae a la aplicación
|
|
del <literal>Datasource</literal> o <literal>DriverManager</literal> subyacente.
|
|
No se expone a la aplicación, pero puede ser extendido/implementado por
|
|
el desarrollador.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>TransactionFactory (<literal>org.hibernate.TransactionFactory</literal>)</term>
|
|
<listitem>
|
|
<para>
|
|
(Opcional) Una fábrica de instancias de <literal>Transaction</literal>.
|
|
No se expone a la aplicación, pero puede ser extendido/implementado por
|
|
el desarrollador.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><emphasis>Interfaces de Extensión</emphasis></term>
|
|
<listitem>
|
|
<para>
|
|
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.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<para>
|
|
Dada una arquitectura "sencilla", la aplicación pasa por alto las APIs
|
|
de <literal>Transaction</literal>/<literal>TransactionFactory</literal> y/o
|
|
<literal>ConnectionProvider</literal>, para hablar directamente a JTA o JDBC.
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="architecture-states" revision="1">
|
|
<title>Estados de instancia</title>
|
|
<para>
|
|
Una instancia de una clase persistente puede estar en uno de tres estados
|
|
diferentes, definidos respecto de su <emphasis>contexto de persistencia</emphasis>.
|
|
El objeto <literal>Session</literal> de Hibernate es el contexto de persistencia:
|
|
</para>
|
|
|
|
<variablelist spacing="compact">
|
|
<varlistentry>
|
|
<term>transitorio</term>
|
|
<listitem>
|
|
<para>
|
|
La instancia no está y nunca estuvo asociada con
|
|
un contexto de persistencia. No tiene identidad persistente
|
|
(valor de clave primaria).
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>persistente</term>
|
|
<listitem>
|
|
<para>
|
|
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 <emphasis>garantiza</emphasis>
|
|
que la identidad persistente es equivalente a la identidad
|
|
Java (localización en memoria del objeto).
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term>separado</term>
|
|
<listitem>
|
|
<para>
|
|
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.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</sect1>
|
|
|
|
<sect1 id="architecture-jmx" revision="1">
|
|
<title>Integración JMX</title>
|
|
|
|
<para>
|
|
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,
|
|
<literal>org.hibernate.jmx.HibernateService</literal>.
|
|
</para>
|
|
|
|
<para>
|
|
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:
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
<emphasis>Gestión de Sesión:</emphasis> El ciclo de vida de la <literal>Session</literal>
|
|
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 <literal>Session</literal> 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
|
|
<literal>Transaction</literal> de Hibernate para esto). Para acceder a una
|
|
<literal>Session</literal> llama al <literal>HibernateContext</literal>.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
<emphasis>Despliegue de HAR:</emphasis> 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 <literal>SessionFactory</literal> 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>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
Para más información sobre estas opciones, consulta la
|
|
Guía de Usuario del JBoss AS.
|
|
</para>
|
|
|
|
<para>
|
|
Otra funcionalidad disponible como un servicio JMX son las estadísticas en
|
|
tiempo de ejecución de Hibernate. Mira <xref linkend="configuration-optional-statistics"/>.
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="architecture-jca" revision="1">
|
|
<title>Soporte JCA:</title>
|
|
<para>
|
|
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.
|
|
</para>
|
|
</sect1>
|
|
|
|
</chapter>
|
|
|