[hibernate-commits] Hibernate SVN: r14075 - in core/trunk/documentation/manual/es-ES/src/main: docbook and 2 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Oct 9 14:45:36 EDT 2007


Author: steve.ebersole at jboss.com
Date: 2007-10-09 14:45:36 -0400 (Tue, 09 Oct 2007)
New Revision: 14075

Added:
   core/trunk/documentation/manual/es-ES/src/main/docbook/Hibernate_Reference.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/architecture.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/association_mapping.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/basic_mapping.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/batch.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/best_practices.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/collection_mapping.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/component_mapping.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/configuration.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/events.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/example_mappings.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/example_parentchild.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/example_weblog.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/filters.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/inheritance_mapping.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/performance.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/persistent_classes.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/preface.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/query_criteria.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/query_hql.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/query_sql.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/quickstart.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/session_api.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/toolset_guide.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/transactions.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/tutorial.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/content/xml.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/AuthorWork.png
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/AuthorWork.zargo
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/CustomerOrderProduct.png
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/CustomerOrderProduct.zargo
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/EmployerEmployee.png
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/EmployerEmployee.zargo
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/full_cream.png
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/full_cream.svg
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/hibernate_logo_a.png
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/lite.png
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/lite.svg
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/overview.png
   core/trunk/documentation/manual/es-ES/src/main/docbook/images/overview.svg
   core/trunk/documentation/manual/es-ES/src/main/docbook/legal_notice.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/legal_notice2.xml
   core/trunk/documentation/manual/es-ES/src/main/docbook/translators.xml
Removed:
   core/trunk/documentation/manual/es-ES/src/main/docbook/master.xml
   core/trunk/documentation/manual/es-ES/src/main/resources/
Log:
new docbook layout (prep for translations migration to PO)

Added: core/trunk/documentation/manual/es-ES/src/main/docbook/Hibernate_Reference.xml
===================================================================
--- core/trunk/documentation/manual/es-ES/src/main/docbook/Hibernate_Reference.xml	                        (rev 0)
+++ core/trunk/documentation/manual/es-ES/src/main/docbook/Hibernate_Reference.xml	2007-10-09 18:45:36 UTC (rev 14075)
@@ -0,0 +1,88 @@
+<?xml version='1.0' encoding="iso-8859-1"?>
+<!--
+  ~ Copyright (c) 2007, Red Hat Middleware, LLC. All rights reserved.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, v. 2.1. This program is distributed in the
+  ~ hope that it will be useful, but WITHOUT A WARRANTY; without even the implied
+  ~ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details. You should have received a
+  ~ copy of the GNU Lesser General Public License, v.2.1 along with this
+  ~ distribution; if not, write to the Free Software Foundation, Inc.,
+  ~ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  ~
+  ~ Red Hat Author(s): Steve Ebersole
+  -->
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+        <!ENTITY versionNumber "3.3.0.alpha1">
+        <!ENTITY copyrightYear "2004">
+        <!ENTITY copyrightHolder "Red Hat Middleware, LLC.">
+]>
+
+<book>
+
+    <bookinfo>
+        <title>HIBERNATE - Persistencia Relacional para Java Idiom&#x00e1;tico</title>
+        <subtitle>Documentaci&#x00f3;n de Referencia de Hibernate</subtitle>
+        <releaseinfo>&versionNumber;</releaseinfo>
+        <productnumber>&versionNumber;</productnumber>
+        <issuenum>1</issuenum>
+        <mediaobject>
+            <imageobject role="fo">
+                <imagedata fileref="images/hibernate_logo_a.png" align="center" />
+            </imageobject>
+            <imageobject role="html">
+                <imagedata fileref="images/hibernate_logo_a.png" depth="3cm" />
+            </imageobject>
+        </mediaobject>
+        <copyright>
+            <year>&copyrightYear;</year>
+            <holder>&copyrightHolder;</holder>
+        </copyright>
+        <xi:include href="translators.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+        <xi:include href="legal_notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+        <xi:include href="legal_notice2.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    </bookinfo>
+
+    <toc/>
+
+    <xi:include href="content/preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+	<xi:include href="content/tutorial.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+	<xi:include href="content/architecture.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+	<xi:include href="content/configuration.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+	<xi:include href="content/persistent_classes.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+    <xi:include href="content/basic_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/collection_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/association_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/component_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/inheritance_mapping.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+    <xi:include href="content/session_api.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/transactions.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/events.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/batch.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+    <xi:include href="content/query_hql.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/query_criteria.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/query_sql.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/filters.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/xml.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+    <xi:include href="content/performance.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+    <xi:include href="content/toolset_guide.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+    <xi:include href="content/example_parentchild.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/example_weblog.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+    <xi:include href="content/example_mappings.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+    <xi:include href="content/best_practices.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+
+</book>
+

Copied: core/trunk/documentation/manual/es-ES/src/main/docbook/content/architecture.xml (from rev 12794, core/trunk/documentation/manual/es-ES/src/main/docbook/modules/architecture.xml)
===================================================================
--- core/trunk/documentation/manual/es-ES/src/main/docbook/content/architecture.xml	                        (rev 0)
+++ core/trunk/documentation/manual/es-ES/src/main/docbook/content/architecture.xml	2007-10-09 18:45:36 UTC (rev 14075)
@@ -0,0 +1,279 @@
+<chapter id="architecture">
+
+    <title>Arquitectura</title>
+
+    <sect1 id="architecture-overview" revision="1">
+        <title>Visi&#x00f3;n General</title>
+        
+        <para>
+            Una visi&#x00f3;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="../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&#x00f3;n para proveer servicios de persistencia (y objetos
+            persistentes) a la aplicaci&#x00f3;n.
+        </para>
+
+        <para>
+            Nos gustar&#x00ed;a mostrar una vista m&#x00e1;s detallada de la arquitectura de tiempo
+            de ejecuci&#x00f3;n. Desafortunadamente, Hibernate es flexible y soporta diferentes
+            enfoques. Mostraremos los dos extremos. En la arquitectura "sencilla", es la
+            aplicaci&#x00f3;n la que provee su propias conexiones JDBC y gestiona sus propias
+            transacciones. Este enfoque usa un m&#x00ed;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="../images/lite.gif" format="GIF" align="center"/>
+            </imageobject>
+        </mediaobject>
+
+        <para>
+            La arquitectura "full cream" abstrae a la aplicaci&#x00f3;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="../images/full_cream.gif" format="GIF" align="center"/>
+            </imageobject>
+        </mediaobject>
+
+        <para>
+            He aqu&#x00ed; algunas definiciones de los objetos en los diagramas:
+            <variablelist spacing="compact">
+                <varlistentry>
+                    <term>SessionFactory (<literal>org.hibernate.SessionFactory</literal>)</term>
+                    <listitem>
+                        <para>
+                            Cach&#x00e9; threadsafe (inmutable) de mapeos compilados para
+                            una sola base de datos. Es una f&#x00e1;brica de <literal>Session</literal>
+                            y un cliente de <literal>ConnectionProvider</literal>. Opcionalmente,
+                            puede mantener una cach&#x00e9; (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&#x00f3;n
+                            entre la aplicaci&#x00f3;n y el almacenamiento persistente. Envuelve una
+                            conexi&#x00f3;n JDBC. Es una f&#x00e1;brica de <literal>Transaction</literal>.
+                            Mantiene una cach&#x00e9; 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&#x00f3;nalidad de negocio. Estos pueden ser JavaBeans/POJOs
+                            (Plain Old Java Objects, o sea, cualquier objeto Java), la &#x00fa;nica
+                            cosa especial en ellos es que estan asociados actualmente con una
+                            (y s&#x00f3;lo una) <literal>Session</literal>. Tan pronto como la 
+                            <literal>Session</literal> sea cerrada, ser&#x00e1;n separados y
+                            estar&#x00e1;n libres para ser usados en cualquier capa de aplicaci&#x00f3;n.
+                            (por ejemplo, directamente como objetos de transferencia de datos hacia
+                            y desde la capa de presentaci&#x00f3;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&#x00f3;n y (a&#x00fa;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&#x00f3;n
+                            para especificar unidades at&#x00f3;micas de trabajo. Abstrae a la aplicaci&#x00f3;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&#x00f3;n de la transacci&#x00f3;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&#x00e1;brica (y pool) de conexiones JDBC. Abstrae a la aplicaci&#x00f3;n
+                            del <literal>Datasource</literal> o <literal>DriverManager</literal> subyacente.
+                            No se expone a la aplicaci&#x00f3;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&#x00e1;brica de instancias de <literal>Transaction</literal>.
+                            No se expone a la aplicaci&#x00f3;n, pero puede ser extendido/implementado por
+                            el desarrollador.
+                        </para>
+                    </listitem>
+                </varlistentry>
+                <varlistentry>
+                    <term><emphasis>Interfaces de Extensi&#x00f3;n</emphasis></term>
+                    <listitem>
+                        <para>
+                            Hibernate ofrece muchas interfaces de extensi&#x00f3;n opcional que puedes
+                            implementar para modificar a medida el comportamiento de tu capa de persistencia.
+                            Para m&#x00e1;s detalles, mira la documentaci&#x00f3;n de la API.
+                        </para>
+                    </listitem>
+                </varlistentry>
+            </variablelist>
+        </para>
+
+        <para>
+            Dada una arquitectura "sencilla", la aplicaci&#x00f3;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&#x00e1; 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&#x00e1; actualmente asociada con un
+                        contexto de persistencia. Tiene una identidad persistente
+                        (valor de clave primaria) y, quiz&#x00e1;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&#x00f3;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&#x00e1;s, una fila correspondiente
+                        en la base de datos. Para las instancias separadas,
+                        Hibernate no establece ninguna garant&#x00ed;a sobre
+                        la relaci&#x00f3;n entre identidad persistente e identidad Java.
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </sect1>    
+
+    <sect1 id="architecture-jmx" revision="1">
+        <title>Integraci&#x00f3;n JMX</title>
+
+        <para>
+            JMX es el est&#x00e1;ndar J2EE para la gesti&#x00f3;n de componentes Java. Hibernate
+            puede ser gestionado por medio de un servicio est&#x00e1;ndar JMX.
+            Proveemos una implementaci&#x00f3;n de MBean en la distribuci&#x00f3;n,
+            <literal>org.hibernate.jmx.HibernateService</literal>.
+        </para>
+
+        <para>
+            Para ejemplo de c&#x00f3;mo desplegar Hibernate como un servicio JMX en un Servidor
+            de Aplicaciones JBoss, por favor, mira la Gu&#x00ed;a del Usuario de JBoss.
+            En JBoss AS, tienes adem&#x00e1;s estos beneficios si despliegas usando JMX:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>Gesti&#x00f3;n de Sesi&#x00f3;n:</emphasis> El ciclo de vida de la <literal>Session</literal>
+                    de Hibernate puede estar autom&#x00e1;ticamente ligado al &#x00e1;mbito de una transacci&#x00f3;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&#x00e1;s tampoco tienes
+                    que preocuparte m&#x00e1;s de la demarcaci&#x00f3;n de la transacci&#x00f3;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&#x00f3;n usuales de una <literal>SessionFactory</literal> de
+                    Hibernate. Sin embargo, todav&#x00ed;a tienes que nombrar todos tus ficheros de mapeo en el
+                    descriptor de despliegue. Si decides usar el depliegue de HAR opcional, JBoss detectar&#x00e1;
+                    autom&#x00e1;ticamente todos los ficheros de mapeo en tu fichero HAR.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            Para m&#x00e1;s informaci&#x00f3;n sobre estas opciones, consulta la
+            Gu&#x00ed;a de Usuario del JBoss AS.
+        </para>
+
+        <para>
+            Otra funcionalidad disponible como un servicio JMX son las estad&#x00ed;sticas en
+            tiempo de ejecuci&#x00f3;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&#x00e1;s ser configurado como un conector JCA. Por favor mira el
+            sitio web para m&#x00e1;s detalles. Por favor ten en cuenta que el soporte de JCA
+            de Hibernate est&#x00e1; a&#x00fa;n considerado experimental.
+        </para>
+    </sect1>
+
+</chapter>
+

Copied: core/trunk/documentation/manual/es-ES/src/main/docbook/content/association_mapping.xml (from rev 12794, core/trunk/documentation/manual/es-ES/src/main/docbook/modules/association_mapping.xml)
===================================================================
--- core/trunk/documentation/manual/es-ES/src/main/docbook/content/association_mapping.xml	                        (rev 0)
+++ core/trunk/documentation/manual/es-ES/src/main/docbook/content/association_mapping.xml	2007-10-09 18:45:36 UTC (rev 14075)
@@ -0,0 +1,527 @@
+<chapter id="associations">
+
+    <title>Mapeos de Asociaci&#x00f3;n</title>
+
+    <sect1 id="assoc-intro" revision="1">
+        <title>Introducci&#x00f3;n</title>
+        
+        <para>
+            Los mapeos de asociaci&#x00f3;n son frecuentemente las cosas mas dif&#x00ed;ciles
+            de hacer correctamente. En esta secci&#x00f3;n iremos a trav&#x00e9;s de los casos
+            can&#x00f3;nicos uno a uno, comenzando con los mapeos unidireccionales, y considerando
+            luego los casos bidireccionales. Usaremos <literal>Person</literal> y <literal>Address</literal>
+            en todos los ejemplos.
+        </para>
+        
+        <para>
+                Clasificaremos las asociaciones por cuanto mapeen o no a una tabla
+                de uni&#x00f3;n interviniente, y por su multiplicidad.
+        </para>
+        
+        <para>
+                Las claves for&#x00e1;neas que aceptan valores nulos (en adelante, nullables)
+                no son consideradas una buena pr&#x00e1;ctica en el modelado tradicional de datos,
+                as&#x00ed; que todos nuestros ejemplos usan claves for&#x00e1;neas no nullables.
+                Esto no es un requerimiento de Hibernate, y todos los mapeos funcionar&#x00e1;n
+                si quitas las restricciones de nulabilidad.
+        </para>
+        
+    </sect1>
+
+    <sect1 id="assoc-unidirectional" revision="1">
+        <title>Asociaciones Unidireccionales</title>
+        
+        <sect2 id="assoc-unidirectional-m21">
+        <title>muchos a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n unidireccional muchos-a-uno</emphasis> es el tipo
+            m&#x00e1;s com&#x00fa;n de asociaciones unidireccionales.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <many-to-one name="address" 
+        column="addressId"
+        not-null="true"/>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+
+        <sect2 id="assoc-unidirectional-121">
+        <title>uno a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n unidireccional uno-a-uno en una clave primaria</emphasis>
+            es casi id&#x00e9;ntica. La &#x00fa;nica diferencia es la restricci&#x00f3;n de unicidad
+            de la columna.
+        </para>
+        
+       <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <many-to-one name="address" 
+        column="addressId" 
+        unique="true"
+        not-null="true"/>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        <para>
+            Usualmente, una <emphasis>asociaci&#x00f3;n unidireccional uno-a-uno en una
+            clave primaria</emphasis> usa un generador de id especial. (Observa que hemos
+            invertido el sentido de la asociaci&#x00f3;n en este ejemplo).
+        </para>
+        
+       <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+</class>
+
+<class name="Address">
+    <id name="id" column="personId">
+        <generator class="foreign">
+            <param name="property">person</param>
+        </generator>
+    </id>
+    <one-to-one name="person" constrained="true"/>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table Address ( personId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+        
+        <sect2 id="assoc-unidirectional-12m">
+        <title>uno a muchos</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n unidireccional uno-a-muchos en una clave for&#x00e1;nea</emphasis>
+            es un caso muy inusual, y realmente no est&#x00e1; recomendada.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <set name="addresses">
+        <key column="personId" 
+            not-null="true"/>
+        <one-to-many class="Address"/>
+    </set>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table Address ( addressId bigint not null primary key, personId bigint not null )
+        ]]></programlisting>
+        
+        <para>
+            Creemos que es mejor usar una tabla de uni&#x00f3;n para este tipo de asociaci&#x00f3;n.
+        </para>
+        
+        </sect2>
+    
+    </sect1>
+
+    <sect1 id="assoc-unidirectional-join" revision="1">
+        <title>Asociaciones unidireccionales con tablas de uni&#x00f3;n</title>
+        
+        <sect2 id="assoc-unidirectional-join-12m">
+        <title>uno a muchos</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n unidireccional uno-a-muchos en una tabla de uni&#x00f3;n</emphasis>
+            es m&#x00e1;s preferible. Observa que especificando <literal>unique="true"</literal>, hemos
+            cambiado la multiplicidad de muchos-a-muchos a uno-a-muchos.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <set name="addresses" table="PersonAddress">
+        <key column="personId"/>
+        <many-to-many column="addressId"
+            unique="true"
+            class="Address"/>
+    </set>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId not null, addressId bigint not null primary key )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+
+        <sect2 id="assoc-unidirectional-join-m21">
+        <title>muchos a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n unidireccional muchos-a-uno en una tabla de uni&#x00f3;n</emphasis>
+            es bastante com&#x00fa;n cuando la asociaci&#x00f3;n es opcional.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <join table="PersonAddress" 
+        optional="true">
+        <key column="personId" unique="true"/>
+        <many-to-one name="address"
+            column="addressId" 
+            not-null="true"/>
+    </join>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null primary key, addressId bigint not null )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+
+        <sect2 id="assoc-unidirectional-join-121">
+        <title>uno a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n unidireccional uno-a-uno en una tabla de uni&#x00f3;n</emphasis>
+            es inusual en extremo, pero posible.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <join table="PersonAddress" 
+        optional="true">
+        <key column="personId" 
+            unique="true"/>
+        <many-to-one name="address"
+            column="addressId" 
+            not-null="true"
+            unique="true"/>
+    </join>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+
+        <sect2 id="assoc-unidirectional-join-m2m">
+        <title>muchos a muchos</title>
+        
+        <para>
+            Finalmente, tenemos una <emphasis>asociaci&#x00f3;n unidireccional muchos-a-muchos</emphasis>
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <set name="addresses" table="PersonAddress">
+        <key column="personId"/>
+        <many-to-many column="addressId"
+            class="Address"/>
+    </set>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+
+    </sect1>
+
+    <sect1 id="assoc-bidirectional" revision="1">
+        <title>Asociaciones Bidireccionales</title>
+        
+        <sect2 id="assoc-bidirectional-m21">
+        <title>uno a muchos / muchos a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n bidireccional muchos-a-uno</emphasis> es
+            el tipo m&#x00e1;s com&#x00fa;n de asociaci&#x00f3;n. (Esta es la relaci&#x00f3;n
+            est&#x00e1;ndar padre/hijo.)
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <many-to-one name="address" 
+        column="addressId"
+        not-null="true"/>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+    <set name="people" inverse="true">
+        <key column="addressId"/>
+        <one-to-many class="Person"/>
+    </set>
+</class>]]></programlisting>
+
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+        
+        <sect2 id="assoc-bidirectional-121">
+        <title>uno a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n bidireccional uno-a-uno en una clave for&#x00e1;nea</emphasis>
+            es bastante com&#x00fa;n.
+        </para>
+        
+       <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <many-to-one name="address" 
+        column="addressId" 
+        unique="true"
+        not-null="true"/>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+   <one-to-one name="person" 
+        property-ref="address"/>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n bidireccional uno-a-uno en una clave primaria</emphasis>
+            usa el generador de id especial.
+        </para>
+        
+       <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <one-to-one name="address"/>
+</class>
+
+<class name="Address">
+    <id name="id" column="personId">
+        <generator class="foreign">
+            <param name="property">person</param>
+        </generator>
+    </id>
+    <one-to-one name="person" 
+        constrained="true"/>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table Address ( personId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+        
+    </sect1>
+
+    <sect1 id="assoc-bidirectional-join" revision="1">
+        <title>Asociaciones bidireccionales con tablas de uni&#x00f3;n</title>
+        
+        <sect2 id="assoc-bidirectional-join-12m">
+        <title>uno a muchos / muchos a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n bidireccional uno-a-muchos en una tabla de uni&#x00f3;n</emphasis>.
+            Observa que el <literal>inverse="true"</literal> puede ir a cualquier lado de la asociaci&#x00f3;n,
+            en la colecci&#x00f3;n, o en la uni&#x00f3;n.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <set name="addresses" 
+        table="PersonAddress">
+        <key column="personId"/>
+        <many-to-many column="addressId"
+            unique="true"
+            class="Address"/>
+    </set>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+    <join table="PersonAddress" 
+        inverse="true" 
+        optional="true">
+        <key column="addressId"/>
+        <many-to-one name="person"
+            column="personId"
+            not-null="true"/>
+    </join>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null, addressId bigint not null primary key )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+
+         <sect2 id="assoc-bidirectional-join-121">
+        <title>uno a uno</title>
+        
+        <para>
+            Una <emphasis>asociaci&#x00f3;n bidireccional uno-a-uno en una tabla de uni&#x00f3;n</emphasis>
+            es inusual en extremo, pero posible.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <join table="PersonAddress" 
+        optional="true">
+        <key column="personId" 
+            unique="true"/>
+        <many-to-one name="address"
+            column="addressId" 
+            not-null="true"
+            unique="true"/>
+    </join>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+    <join table="PersonAddress" 
+        optional="true"
+        inverse="true">
+        <key column="addressId" 
+            unique="true"/>
+        <many-to-one name="address"
+            column="personId" 
+            not-null="true"
+            unique="true"/>
+    </join>
+</class>]]></programlisting>
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+
+        </sect2>
+        
+        <sect2 id="assoc-bidirectional-join-m2m">
+        <title>muchos a muchos</title>
+        
+        <para>
+            Finalmente, tenemos una <emphasis>asociaci&#x00f3;n bidireccional muchos-a-muchos</emphasis>.
+        </para>
+        
+        <programlisting><![CDATA[<class name="Person">
+    <id name="id" column="personId">
+        <generator class="native"/>
+    </id>
+    <set name="addresses">
+        <key column="personId"/>
+        <many-to-many column="addressId"
+            class="Address"/>
+    </set>
+</class>
+
+<class name="Address">
+    <id name="id" column="addressId">
+        <generator class="native"/>
+    </id>
+    <set name="people" inverse="true">
+        <key column="addressId"/>
+        <many-to-many column="personId"
+            class="Person"/>
+    </set>
+</class>]]></programlisting>
+
+        <programlisting><![CDATA[
+create table Person ( personId bigint not null primary key )
+create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )
+create table Address ( addressId bigint not null primary key )
+        ]]></programlisting>
+        
+        </sect2>
+        
+    </sect1>
+
+
+</chapter>
+

Copied: core/trunk/documentation/manual/es-ES/src/main/docbook/content/basic_mapping.xml (from rev 12794, core/trunk/documentation/manual/es-ES/src/main/docbook/modules/basic_mapping.xml)
===================================================================
--- core/trunk/documentation/manual/es-ES/src/main/docbook/content/basic_mapping.xml	                        (rev 0)
+++ core/trunk/documentation/manual/es-ES/src/main/docbook/content/basic_mapping.xml	2007-10-09 18:45:36 UTC (rev 14075)
@@ -0,0 +1,3222 @@
+<chapter id="mapping">
+    <title>Mapeo O/R B&#x00e1;sico</title>
+
+    <sect1 id="mapping-declaration" revision="1">
+        <title>Declaraci&#x00f3;n de mapeo</title>
+
+        <para>
+            Los mapeos objeto/relacional se definen usualmente en un documento XML.
+            El documento de mapeo est&#x00e1; dise&#x00f1;ado para ser le&#x00ed;ble y 
+            editable a mano. El lenguaje de mapeo es Java-c&#x00e9;ntrico, o sea que los
+            mapeos se construyen alrededor de declaraciones de clases persistentes,
+            no declaraciones de tablas.
+        </para>
+        
+        <para>
+            Observa que, incluso aunque muchos usuarios de Hibernate eligen escribir el
+            XML a mano, existe una cantidad de herramientas para generar el documento de
+            mapeo, incluyendo XDoclet, Middlegen y AndroMDA.
+        </para>
+
+        <para>
+            Comencemos por un mapeo de ejemplo:
+        </para>
+
+        <programlisting id="mapping-declaration-ex1" revision="1"><![CDATA[<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="eg">
+
+        <class name="Cat" 
+            table="cats"
+            discriminator-value="C">
+                
+                <id name="id">
+                        <generator class="native"/>
+                </id>
+
+                <discriminator column="subclass" 
+                     type="character"/>
+
+                <property name="weight"/>
+
+                <property name="birthdate"
+                    type="date" 
+                    not-null="true" 
+                    update="false"/>
+
+                <property name="color"
+                    type="eg.types.ColorUserType"
+                    not-null="true"
+                    update="false"/>
+
+                <property name="sex"
+                    not-null="true" 
+                    update="false"/>
+
+                <property name="litterId"
+                    column="litterId"
+                    update="false"/>
+
+                <many-to-one name="mother"
+                    column="mother_id"
+                    update="false"/>
+
+                <set name="kittens"
+                    inverse="true"
+                    order-by="litter_id">
+                        <key column="mother_id"/>
+                        <one-to-many class="Cat"/>
+                </set>
+
+                <subclass name="DomesticCat"
+                    discriminator-value="D">
+
+                        <property name="name" 
+                            type="string"/>
+
+                </subclass>
+
+        </class>
+
+        <class name="Dog">
+                <!-- mapping for Dog could go here -->
+        </class>
+
+</hibernate-mapping>]]></programlisting>
+
+        <para>
+             Discutiremos ahora el contenido del documento de mapeo. Describiremos s&#x00f3;lo los
+             elementos y atributos que son usados por Hibernate en tiempo de ejecuci&#x00f3;n. El
+             documento de mapeo contiene adem&#x00e1;s algunos atributos y elementos extra opcionales
+             que afectan los esquemas de base de datos exportados por la herramienta de exportaci&#x00f3;n
+             de esquemas. (Por ejemplo, el atributo <literal>not-null</literal>.)
+        </para>
+
+
+
+        <sect2 id="mapping-declaration-doctype" revision="2">
+            <title>Doctype</title>
+
+            <para>
+                Todos los mapeos XML deben declarar el doctype mostrado. El DTD actual puede
+                ser encontrado en el URL mencionado arriba, en el directorio
+                <literal>hibernate-x.x.x/src/org/hibernate</literal>, o en <literal>hibernate3.jar</literal>.
+                Hibernate siempre buscar&#x00e1; el DTD primero en el classpath. Si experimentas
+                b&#x00fa;squedas del DTD usando una conexi&#x00f3;n de Internet, chequea tu declaraci&#x00f3;n
+                de DTD contra la contenida en el classpath.
+            </para>
+        </sect2>
+
+        <sect2 id="mapping-declaration-mapping" revision="3">
+            <title>hibernate-mapping</title>
+
+            <para>
+                Este elemento tiene muchos atributos opcionales. Los atributos <literal>schema</literal>
+                y <literal>catalog</literal> especifican que las tablas a las que se refiere en el mapeo
+                pertenecen al esquema y/o cat&#x00e1;logo mencionado(s). De especificarse, los nombres de
+                tablas ser&#x00e1;n cualificados por el nombre de esquema y cat&#x00e1;logo dados.
+                De omitirse, los nombres de tablas no ser&#x00e1;n cualificados. El atributo
+                <literal>default-cascade</literal> especifica qu&#x00e9; estilo de cascada debe asumirse
+                para las propiedades y colecciones que no especifican un atributo <literal>cascade</literal>.
+                El atributo <literal>auto-import</literal> nos permite usar nombres de clase sin cualificar
+                en el lenguaje de consulta, por defecto.
+            </para>
+ 
+             <programlistingco>
+                 <areaspec>
+                     <area id="hm1" coords="2 55"/>
+                     <area id="hm2" coords="3 55"/>
+                     <area id="hm3" coords="4 55"/>
+                     <area id="hm4" coords="5 55"/>
+                     <area id="hm5" coords="6 55"/>
+                     <area id="hm6" coords="7 55"/>
+                     <area id="hm7" coords="8 55"/>
+                 </areaspec>
+                 <programlisting><![CDATA[<hibernate-mapping
+         schema="schemaName"
+         catalog="catalogName"
+         default-cascade="cascade_style"
+         default-access="field|property|ClassName"
+         default-lazy="true|false"
+         auto-import="true|false"
+         package="package.name"
+ />]]></programlisting>
+                 <calloutlist>
+                     <callout arearefs="hm1">
+                         <para>
+                             <literal>schema</literal> (opcional): El nombre de un esquema de la base de datos.
+                         </para>
+                     </callout>
+                     <callout arearefs="hm2">
+                         <para>
+                             <literal>catalog</literal> (opcional): El nombre de un cat&#x00e1;logo de la base de datos.
+                         </para>
+                     </callout>
+                     <callout arearefs="hm3">
+                         <para>
+                             <literal>default-cascade</literal> (opcional - por defecto a <literal>none</literal>): 
+                             Un estilo de cascada por defecto.
+                         </para>
+                     </callout>
+                     <callout arearefs="hm4">
+                         <para>
+                             <literal>default-access</literal> (opcional - por defecto a <literal>property</literal>):
+                             La estrategia que Hibernate debe usar para acceder a todas las propiedades.
+                             Puede ser una implementaci&#x00f3;n personalizada de <literal>PropertyAccessor</literal>.
+                         </para>
+                     </callout>
+                     <callout arearefs="hm5">
+                         <para>
+                             <literal>default-lazy</literal> (opcional - por defecto a <literal>true</literal>):
+                             El valor por defecto para los atributos <literal>lazy</literal> de mapeos de clase
+                             y colleci&#x00f3;n no especificados.
+                         </para>
+                     </callout>
+                     <callout arearefs="hm6">
+                         <para>
+                             <literal>auto-import</literal> (opcional - por defecto a <literal>true</literal>):
+                             Especifica si podemos usar nombres de clases no cualificados (de clases en este mapeo)
+                             en el lenguaje de consulta.
+                         </para>
+                     </callout>
+                     <callout arearefs="hm7">
+                         <para>
+                             <literal>package</literal> (opcional): Especifica un prefijo de paquete a asumir
+                             para los nombres no cualificados de clase en el documento de mapeo.
+                         </para>
+                     </callout>
+                 </calloutlist>
+             </programlistingco>
+             
+             <para>
+                 Si tienes dos clases persistentes con el mismo nombre (sin cualificar), debes establecer
+                 <literal>auto-import="false"</literal>. Hibernate lanzar&#x00e1; una excepci&#x00f3;n si
+                 intentas asignar dos clases al mismo nombre "importado".
+             </para>
+
+             <para>
+                 Observa que el elemento <literal>hibernate-mapping</literal> te permite anidar
+                 muchos mapeos <literal>&lt;class&gt;</literal> persistentes, como se muestra arriba.
+                 Sin embargo, es una buena pr&#x00e1;ctica (y se espera de algunas herramientas) mapear
+                 s&#x00f3;lo a una sola clase persistente (o a una sola jerarqu&#x00ed;a de clases) en
+                 un fichero de mapeo y nombrarlo despu&#x00e9;s de la superclase persistente;
+                 por ejemplo, <literal>Cat.hbm.xml</literal>, <literal>Dog.hbm.xml</literal>,
+                 o, si se usa herencia, <literal>Animal.hbm.xml</literal>.
+             </para>
+ 
+        </sect2>
+
+        <sect2 id="mapping-declaration-class" revision="3">
+            <title>class</title>
+
+            <para>
+                Puedes declarar una clase persistente usando el elemento <literal>class</literal>:
+            </para>
+            
+            <programlistingco>
+                <areaspec>
+                    <area id="class1" coords="2 55"/>
+                    <area id="class2" coords="3 55" />
+                    <area id="class3" coords="4 55"/>
+                    <area id="class4" coords="5 55" />
+                    <area id="class5" coords="6 55"/>
+                    <area id="class6" coords="7 55" />
+                    <area id="class7" coords="8 55"/>
+                    <area id="class8" coords="9 55" />
+                    <area id="class9" coords="10 55" />
+                    <area id="class10" coords="11 55"/>
+                    <area id="class11" coords="12 55"/>
+                    <area id="class12" coords="13 55"/>
+                    <area id="class13" coords="14 55"/>
+                    <area id="class14" coords="15 55"/>
+                    <area id="class15" coords="16 55"/>
+                    <area id="class16" coords="17 55"/>
+                    <area id="class17" coords="18 55"/>
+                    <area id="class18" coords="19 55"/>
+                    <area id="class19" coords="20 55"/>
+                    <area id="class20" coords="21 55"/>
+                    <area id="class21" coords="22 55"/>
+                </areaspec>
+                <programlisting><![CDATA[<class
+        name="ClassName"
+        table="tableName"
+        discriminator-value="discriminator_value"
+        mutable="true|false"
+        schema="owner"
+        catalog="catalog"
+        proxy="ProxyInterface"
+        dynamic-update="true|false"
+        dynamic-insert="true|false"
+        select-before-update="true|false"
+        polymorphism="implicit|explicit"
+        where="arbitrary sql where condition"
+        persister="PersisterClass"
+        batch-size="N"
+        optimistic-lock="none|version|dirty|all"
+        lazy="true|false"
+        entity-name="EntityName"
+        check="arbitrary sql check condition"
+        rowid="rowid"
+        subselect="SQL expression"
+        abstract="true|false"
+        node="element-name"
+/>]]></programlisting>
+                <calloutlist>
+                    <callout arearefs="class1">
+                        <para>
+                            <literal>name</literal> (opcional): El nombre completamente cualificado de la clase
+                            Java persistente (o interface). Si este atributo es omitido, se asume que el mapeo
+                            es para una entidad non-POJO.
+                        </para>
+                    </callout>
+                    <callout arearefs="class2">
+                        <para>
+                            <literal>table</literal> (opcional - por defecto al nombre no cualificado de la clase):
+                            El nombre de su tabla en base de datos.
+                        </para>
+                    </callout>
+                    <callout arearefs="class3">
+                        <para>
+                            <literal>discriminator-value</literal> (opcional - por defecto al nombre de la clase):
+                            Un valor que distingue subclases individuales, usado para el comportamiento
+                            polim&#x00f3;rfico. Los valores aceptables incluyen <literal>null</literal>
+                            y <literal>not null</literal>.
+                        </para>
+                    </callout>
+                    <callout arearefs="class4">
+                        <para>
+                            <literal>mutable</literal> (opcional, por defecto a <literal>true</literal>):
+                            Especifica que las instancias de la clase (no) son mutables.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class5">
+                        <para>
+                            <literal>schema</literal> (opcional): Sobreescribe el nombre de esquema especificado
+                            por el elemento ra&#x00ed;z <literal>&lt;hibernate-mapping&gt;</literal>.
+                        </para>
+                    </callout>                
+                    <callout arearefs="class6">
+                        <para>
+                            <literal>catalog</literal> (opcional): Sobreescribe el nombre de cat&#x00e1;logo
+                            especificado por el elemento ra&#x00ed;z <literal>&lt;hibernate-mapping&gt;</literal>.
+                        </para>
+                    </callout>                
+                    <callout arearefs="class7">
+                        <para>
+                            <literal>proxy</literal> (opcional): Especifica una interface a usar para proxies
+                            de inicializaci&#x00f3;n perezosa. Puedes especificar el nombre mismo de la clase.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class8">
+                        <para>
+                            <literal>dynamic-update</literal> (opcional, por defecto a <literal>false</literal>): 
+                            Especifica que el SQL <literal>UPDATE</literal> debe ser generado en tiempo de
+                            ejecuci&#x00f3;n y contener solamente aquellas columnas cuyo valor haya cambiado.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class9">
+                        <para>
+                            <literal>dynamic-insert</literal> (opcional, por defecto a <literal>false</literal>): 
+                            Especifica que el SQL <literal>INSERT</literal> debe ser generado en tiempo de
+                            ejecuci&#x00f3;n y contener solamente aquellas columnas cuyo valores no son nulos.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class10">
+                        <para>
+                            <literal>select-before-update</literal> (opcional, por defecto a <literal>false</literal>): 
+                            Especifica que Hibernate <emphasis>nunca</emphasis> debe realizar un SQL <literal>UPDATE</literal> 
+                            a menos que se tenga certeza que un objeto haya sido modificado realmente.
+                            En ciertos casos, (realmente, s&#x00f3;lo cuando un objeto transitorio ha sido asociado
+                            con una sesi&#x00f3;n nueva usando <literal>update()</literal>), esto significa que Hibernate
+                            realizar&#x00e1; una SQL <literal>SELECT</literal> extra para determinar si un
+                            <literal>UPDATE</literal> es realmente requerido.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class11">
+                        <para>
+                            <literal>polymorphism</literal> (opcional, por defecto a <literal>implicit</literal>): 
+                            Determina si se usa polimorfismo de consulta impl&#x00ed;cito o expl&#x00ed;cito.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class12">
+                        <para>
+                            <literal>where</literal> (opcional) especifica una condici&#x00f3;n SQL <literal>WHERE</literal>
+                            arbitraria paraa ser usada al recuperar objetos de esta clase.
+                        </para>
+                    </callout>                 
+                    <callout arearefs="class13">
+                        <para>
+                            <literal>persister</literal> (opcional): Especifica un <literal>ClassPersister</literal>
+                            personalizado.
+                        </para>
+                    </callout>                 
+                    <callout arearefs="class14">
+                        <para>
+                            <literal>batch-size</literal> (opcional, por defecto a <literal>1</literal>)
+                            especifica un "tama&#x00f1;o de lote" para traer instancias de esta clase por
+                            identificador.
+                        </para>
+                    </callout>                 
+                   <callout arearefs="class15">
+                        <para>
+                            <literal>optimistic-lock</literal> (opcional, por defecto a <literal>version</literal>):
+                            Determina la estrategia optimista de bloqueo.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class16">
+                        <para>
+                            <literal>lazy</literal> (opcional):
+                            La recuperaci&#x00f3;n perezosa puede ser deshabilitada por completo estableciendo
+                            <literal>lazy="false"</literal>.
+                        </para>
+                    </callout>    
+                    <callout arearefs="class17">
+                        <para>
+                            <literal>entity-name</literal> (opcional): Hibernate3 permite que una clase sea
+                            mapeada varias veces (potencialmente a tablas diferentes), y permite que los mapeos
+                            de entidad sean representados por Maps o XML al nivel de Java. En estos casos,
+                            debes proveer un nombre expl&#x00ed;cito arbitrario para la entidad.
+                            Para m&#x00e1;s informaci&#x00f3;n, mira
+                            <xref linkend="persistent-classes-dynamicmodels"/> y <xref linkend="xml"/>.
+                        </para>
+                    </callout>
+                    <callout arearefs="class18">
+                        <para>
+                            <literal>check</literal> (opcional): Una expresi&#x00f3;n SQL usada para generar
+                            una restricci&#x00f3;n <emphasis>check</emphasis> multi-fila para la generaci&#x00f3;n
+                            autom&#x00e1;tica de esquema.
+                        </para>
+                    </callout>
+                    <callout arearefs="class19">
+                        <para>
+                            <literal>rowid</literal> (opcional): Hibernate puede usar los llamados ROWIDs en las
+                            bases de datos que los soporten. Por ejemplo, en Oracle, Hibernate puede usar la columna
+                            extra <literal>rowid</literal> para actualizaciones r&#x00e1;pidas si estableces esta
+                            opci&#x00f3;n a <literal>rowid</literal>. Un ROWID es un detalle de implementaci&#x00f3;n
+                            y representa la posici&#x00f3;n f&#x00ed;sica de la tupla almacenada.
+                        </para>
+                    </callout>
+                    <callout arearefs="class20">
+                        <para>
+                            <literal>subselect</literal> (opcional): Mapea una entidad inmutable y de s&#x00f3;lo
+                            lectura a una subselect de base de datos. Es &#x00fa;til si quieres tener una vista
+                            en vez de una tabla base, pero no tienes vistas. Mira debajo para m&#x00e1;s informaci&#x00f3;n.
+                        </para>
+                    </callout>
+                    <callout arearefs="class21">
+                        <para>
+                            <literal>abstract</literal> (opcional): Usado para marcar superclases abstractas en
+                            jerarqu&#x00ed;as <literal>&lt;union-subclass&gt;</literal>.
+                        </para>
+                    </callout>
+                </calloutlist>
+            </programlistingco>
+           
+            <para>
+                Es perfectamente aceptable que la clase persistente mencionada sea una interface.
+                Entonces declarar&#x00ed;as clases que implementan esa interface usando el elemento
+                <literal>&lt;subclass&gt;</literal>. Puedes persistir cualquier clase interna
+                <emphasis>est&#x00e1;tica</emphasis>. Debes especificar el nombre de la clase usando la forma
+                est&#x00e1;ndar. Por ejemplo, <literal>eg.Foo$Bar</literal>.
+            </para>
+
+            <para>
+                Las clases inmutables, <literal>mutable="false"</literal>, no pueden ser actualizadas o
+                borradas por la aplicaci&#x00f3;n. Esto permite a Hibernate hacer ciertas optimizaciones
+                menores de rendimiento.
+            </para>
+            
+            <para>
+                El atributo opcional <literal>proxy</literal> habilita la inicializaci&#x00f3;n postergada
+                de instancias persistentes de la clase. Hibernate inicialmente retornar&#x00e1; proxies
+                CGLIB que implementan la interface mencionada. El objeto persistente real ser&#x00e1;
+                cargado cuando se invoque un m&#x00e9;todo del proxy. Mira "Proxies para Inicializaci&#x00f3;n
+                Postergada" debajo.
+            </para>
+            
+            <para>
+                Por polimorfismo <emphasis>impl&#x00ed;cito</emphasis> se entiende que las instancias de la clase
+                ser&#x00e1;n devueltas por una consulta que mencione cualquier superclase, o interface implementada,
+                o la clase misma; y que las instancias de cualquier subclase de la clase ser&#x00e1;n devueltas
+                por una clase que mencione a la clase en s&#x00ed;.
+                Por polimorfismo <emphasis>expl&#x00ed;cito</emphasis> se entiende que instancias de la clase
+                ser&#x00e1;n devueltas s&#x00f3;lo por consultas que mencionen expl&#x00ed;citamente la clase;
+                y que las consultas que mencionen la clase devolver&#x00e1;n s&#x00f3;lo instancias de subclases
+                mapeadas dentro de esta declaraci&#x00f3;n <literal>&lt;class&gt;</literal> como una
+                <literal>&lt;subclass&gt;</literal> o <literal>&lt;joined-subclass&gt;</literal>.
+                Para la mayor&#x00ed;a de los prop&#x00f3;sitos el defecto,
+                <literal>polymorphism="implicit"</literal>, resulta apropiado.
+                El polimorfismo expl&#x00ed;cito es &#x00fa;til cuando dos clases diferentes est&#x00e1;n
+                mapeadas a la misma tabla (esto permite tener una clase "liviana" que contenga un subconjunto
+                de columnas de la tabla).
+            </para>
+            
+            <para>
+                El atributo <literal>persister</literal> te permite personalizar la estrategia de persistencia
+                para la clase. Puedes, por ejemplo, especificar tu propia subclase de
+                <literal>org.hibernate.persister.EntityPersister</literal> o incluso puedes proveer una implementaci&#x00f3;n
+                completamente nueva de la interface <literal>org.hibernate.persister.ClassPersister</literal> que implemente
+                la persistencia por medio, por ejemplo, de llamadas a procedimientos almacenados, serializaci&#x00f3;n a
+                ficheros planos o LDAP. Para un ejemplo simple (de persistencia a una  <literal>Hashtable</literal>) mira 
+                <literal>org.hibernate.test.CustomPersister</literal>.
+            </para>
+            
+            <para>
+                Observa que los valores de <literal>dynamic-update</literal> y <literal>dynamic-insert</literal>
+                no son heredados por las subclases y por lo tanto deben especificarse en los elementos
+                <literal>&lt;subclass&gt;</literal> o <literal>&lt;joined-subclass&gt;</literal>.
+                Estos ajustes pueden incrementar el rendimiento en algunos casos, pero podr&#x00ed;an mermarlo en otros.
+                Ten juicio en su uso.
+            </para>
+            
+            <para>
+                Generalmente el uso de <literal>select-before-update</literal> disminuir&#x00e1; el rendimiento.
+                Es muy &#x00fa;til prevenir que se llame innecesariamente a un disparador de actualizaci&#x00f3;n de
+                base de datos al volver a unir un grafo de instancias separadas a una <literal>Session</literal>.
+            </para>
+            
+            <para>
+                Si habilitas <literal>dynamic-update</literal>, tendr&#x00e1;s opci&#x00f3;n de estrategias
+                de bloqueo optimistas:
+            </para>
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        <literal>version</literal> chequea las columnas de versi&#x00f3;n/timestamp
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <literal>all</literal> chequea todas las columnas
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <literal>dirty</literal> chequea las columnas modificadas, permitiendo algunas
+                        actualizaciones concurrentes
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <literal>none</literal> no usa bloqueo optimista
+                    </para>
+                </listitem>
+            </itemizedlist>
+            <para>
+                Recomendamos <emphasis>muy</emphasis> fuertemente que uses columnas de
+                versi&#x00f3;n/timestamp para bloqueo optimista con Hibernate. Esta es la estrategia
+                &#x00f3;ptima con respecto al rendimiento y es la &#x00fa;nica estrategia que maneja
+                correctamente las modificaciones hechas a las instancias separadas.
+                (por ejemplo, cuando se usa <literal>Session.merge()</literal>).
+            </para>
+
+            <para>
+                Para un mapeo de Hibernate, no hay diferencia entre una vista y una tabla base.
+                Como se supone esto es transparente a nivel de base de datos (observa que algunos
+                DBMS no soportan correctamente las vistas, especialmente con las actualizaciones).
+                A veces quieres usar una vista, pero no puedes crear una en la base de datos
+                (por ejemplo, con un esquema heredado). En este caso, puedes mapear una entidad inmutable
+                de s&#x00f3;lo lectura a una expresi&#x00f3;n de subconsulta SQL dada.
+            </para>
+
+            <programlisting><![CDATA[<class name="Summary">
+    <subselect>
+        select item.name, max(bid.amount), count(*)
+        from item
+        join bid on bid.item_id = item.id
+        group by item.name
+    </subselect>
+    <synchronize table="item"/>
+    <synchronize table="bid"/>
+    <id name="name"/>
+    ...
+</class>]]></programlisting>
+
+            <para>
+                Declara las tablas con las que sincronizar esta entidad, asegurando que el auto-flush
+                ocurre correctamente, y que las consultas contra la entidad derivada no devuelven datos
+                desactualizados. El <literal>&lt;subselect&gt;</literal> est&#x00e1; disponible tanto
+                como un atributo o como un elemento anidado de mapeo.
+            </para>
+
+        </sect2>
+
+        <sect2 id="mapping-declaration-id" revision="3">
+            <title>id</title>
+
+            <para>
+                Las clases mapeadas <emphasis>deben</emphasis> declarar la columna de clave primaria de la tabla
+                de la base de datos. En la mayor&#x00ed;a de los casos tendr&#x00e1; tambi&#x00e9;n una propiedad
+                estilo Javabeans que tenga el identificador &#x00fa;nico de una instancia. El elemento
+                <literal>&lt;id&gt;</literal> define el mapeo de esa propiedad a la columna de clave primaria.
+            </para>
+            
+            <programlistingco>
+                <areaspec>
+                    <area id="id1" coords="2 70"/>
+                    <area id="id2" coords="3 70" />
+                    <area id="id3" coords="4 70"/>
+                    <area id="id4" coords="5 70" />
+                    <area id="id5" coords="6 70" />
+                </areaspec>
+                <programlisting><![CDATA[<id
+        name="propertyName"
+        type="typename"
+        column="column_name"
+        unsaved-value="null|any|none|undefined|id_value"
+        access="field|property|ClassName"
+        node="element-name|@attribute-name|element/@attribute|.">
+
+        <generator class="generatorClass"/>
+</id>]]></programlisting>
+                <calloutlist>
+                    <callout arearefs="id1">
+                        <para>
+                            <literal>name</literal> (opcional): El nombre de la propiedad del indentificador.
+                        </para>
+                    </callout>
+                    <callout arearefs="id2">
+                        <para>
+                            <literal>type</literal> (opcional): Un nombre que indica el tipo Hibernate.
+                        </para>
+                    </callout>
+                    <callout arearefs="id3">
+                        <para>
+                            <literal>column</literal> (opcional - por defecto al nombre de la propiedad): 
+                            El nombre de la columna de clave primaria.
+                        </para>
+                    </callout>
+                    <callout arearefs="id4">
+                        <para>
+                            <literal>unsaved-value</literal> (opcional - por defecto al valor "sensible"): 
+                            Una valor de la propiedad identificadora que indica que una instancia est&#x00e1;
+                            reci&#x00e9;n instanciada (sin salvar), distingui&#x00e9;ndola de instancias separadas
+                            que fueran salvadas o cargadas en una sesi&#x00f3;n previa.
+                        </para>
+                    </callout>            
+                   <callout arearefs="id5">
+                        <para>
+                            <literal>access</literal> (opcional - por defecto a <literal>property</literal>):
+                            La estrategia que Hibernate debe usar para acceder al valor de la propiedad.
+                        </para>
+                    </callout>
+                </calloutlist>
+            </programlistingco>
+            
+            <para>
+                Si se omite el atributo <literal>name</literal>, se asume que la clase no tiene propiedad
+                identificadora.
+            </para>
+            
+            <para>
+                El atributo <literal>unsaved-value</literal> es importante! Si la propiedad identificadora de tu
+                clase no tiene por defecto el valor por defecto normal de Java (null o cero), entonces debes especificar
+                el valor por defecto real.
+            </para>
+
+             <para>
+                Hay una declaraci&#x00f3;n <literal>&lt;composite-id&gt;</literal> alternativa para permitir acceso
+                a datos heredados con claves compuestas. Desalentamos fuertemente su uso para cualquier otra cosa.
+            </para>
+            
+            <sect3 id="mapping-declaration-id-generator" revision="2">
+                <title>Generator</title>
+
+                <para>
+                    El elemento hijo opcional <literal>&lt;generator&gt;</literal> nombra una clase Java
+                    usada en generar identificadores &#x00fa;nicos para instancias de la clase persistente.
+                    De requerirse alg&#x00fa;n par&#x00e1;metro para configurar o inicializar la instancia del generador,
+                    se pasa usando el elemento <literal>&lt;param&gt;</literal>.
+                </para>
+
+                <programlisting><![CDATA[<id name="id" type="long" column="cat_id">
+        <generator class="org.hibernate.id.TableHiLoGenerator">
+                <param name="table">uid_table</param>
+                <param name="column">next_hi_value_column</param>
+        </generator>
+</id>]]></programlisting>
+
+                <para>
+                    Todos los generadores implementan la interface <literal>org.hibernate.id.IdentifierGenerator</literal>.
+                    Esta es una interface muy simple; algunas aplicaciones pueden escoger proveer sus propias
+                    implementaciones especializadas. Sin embargo, Hibernate provee un rango de implementaciones
+                    prefabricadas. Hay nombres alias de atajo para los generadores prefabricados:
+                    <variablelist>
+                        <varlistentry>
+                        <term><literal>increment</literal></term>
+                        <listitem>
+                            <para>
+                                genera indentificadores de tipo <literal>long</literal>, <literal>short</literal> o
+                                <literal>int</literal> que s&#x00f3;lo son &#x00fa;nicos cuando ning&#x00fa;n otro proceso
+                                est&#x00e1; insertando datos en la misma tabla. <emphasis>No usar en un cluster.</emphasis>
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>identity</literal></term>
+                        <listitem>
+                            <para>
+                                soporta columnas de identidad en DB2, MySQL, MS SQL Server, Sybase y
+                                HypersonicSQL. El identificador devuelto es de tipo <literal>long</literal>,
+                                <literal>short</literal> o <literal>int</literal>.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>sequence</literal></term>
+                        <listitem>
+                            <para>
+                                usa una secuencia en DB2, PostgreSQL, Oracle, SAP DB, McKoi o un generador
+                                en Interbase. El identificador devuelto es de tipo <literal>long</literal>,
+                                <literal>short</literal> o <literal>int</literal>.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>hilo</literal></term>
+                        <listitem>
+                            <para id="mapping-declaration-id-hilodescription" revision="1">
+                                usa un algoritmo alto/bajo para generar eficientemente identificadores de tipo
+                                <literal>long</literal>, <literal>short</literal> o <literal>int</literal>,
+                                dada una tabla y columna como fuente de valores altos (por defecto
+                                <literal>hibernate_unique_key</literal> y <literal>next_hi</literal> respectivamente).
+                                El algoritmo alto/bajo genera identificadores que son &#x00fa;nicos s&#x00f3;lo para una
+                                base de datos particular.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>seqhilo</literal></term>
+                        <listitem>
+                            <para>
+                                usa un algoritmo alto/bajo para generar eficientemente identificadores de tipo
+                                <literal>long</literal>, <literal>short</literal> o <literal>int</literal>,
+                                dada una secuencia de base de datos.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>uuid</literal></term>
+                        <listitem>
+                            <para>
+                                usa un algoritmo UUID de 128 bits para generar identificadore de tipo
+                                cadena, &#x00fa;nicos en una ref (se usa la direcc&#x00f3;n IP). El UUID
+                                se codifica como una cadena hexadecimal de 32 d&#x00ed;gitos de largo.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>guid</literal></term>
+                        <listitem>
+                            <para>
+                                usa una cadena GUID generada por base de datos en MS SQL Server y MySQL.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>native</literal></term>
+                        <listitem>
+                            <para>
+                                selecciona <literal>identity</literal>, <literal>sequence</literal> o
+                                <literal>hilo</literal> dependiendo de las capacidades de la base de datos
+                                subyacente.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>assigned</literal></term>
+                        <listitem>
+                            <para>
+                                deja a la aplicaci&#x00f3;n asignar un identificador al objeto antes
+                                de que se llame a <literal>save()</literal>. Esta es la estrategia
+                                por defecto si no se especifica un elemento <literal>&lt;generator&gt;</literal>.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>select</literal></term>
+                        <listitem>
+                            <para>
+                                recupera una clave primaria asignada por un disparador de base de datos
+                                seleccionando la fila por alguna clave &#x00fa;nica y recuperando el valor de
+                                la clave primaria.
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                        <varlistentry>
+                        <term><literal>foreign</literal></term>
+                        <listitem>
+                            <para>
+                                usa el identificador de otro objeto asociado. Generalmente usado en conjunc&#x00f3;n
+                                a una asociac&#x00f3;n de clave primaria <literal>&lt;uno-a-uno&gt;</literal>
+                            </para>
+                        </listitem>
+                        </varlistentry>
+                    </variablelist>
+
+                </para>
+            </sect3>
+            
+            <sect3 id="mapping-declaration-id-hilo" revision="1">
+                <title>Algoritmo alto/bajo</title>
+                <para>
+                    Los generadores <literal>hilo</literal> y <literal>seqhilo</literal> proveen dos implementaciones
+                    alternativas del algoritmo alto/bajo, un enfoque favorito en generaci&#x00f3;n de identificadores.
+                    La primera implementaci&#x00f3;n requiere de una tabla "especial" de base de datos para tener el siguiente
+                    valor "alto" disponible.
+                    La segunda usa una secuencia del estilo de Oracle (donde se soporte).
+                </para>
+
+                <programlisting><![CDATA[<id name="id" type="long" column="cat_id">
+        <generator class="hilo">
+                <param name="table">hi_value</param>
+                <param name="column">next_value</param>
+                <param name="max_lo">100</param>
+        </generator>
+</id>]]></programlisting>
+
+                <programlisting><![CDATA[<id name="id" type="long" column="cat_id">
+        <generator class="seqhilo">
+                <param name="sequence">hi_value</param>
+                <param name="max_lo">100</param>
+        </generator>
+</id>]]></programlisting>
+
+                <para>
+                    Desafortunadamente, no puedes usar <literal>hilo</literal> cuando le proveas tu propia
+                    <literal>Connection</literal> a Hibernate. Cuando Hibernate est&#x00e1; usando un datasource
+                    del servidor de aplicaciones para obtener conexiones alistadas con JTA, debes configurar
+                    correctamente el <literal>hibernate.transaction.manager_lookup_class</literal>.
+                </para>
+            </sect3>
+            
+            <sect3 id="mapping-declaration-id-uuid">
+                <title>Algoritmo UUID</title>
+                <para>
+                    El UUID contiene: la direcci&#x00f3;n IP, el instante de arranque de la JVM
+                    (con una precisi&#x00f3;n de un cuarto de segundo), el tiempo de sistema y un valor
+                    de contador (&#x00fa;nico en la JVM). No es posible obtener una direcci&#x00f3;n MAC o
+                    una direcci&#x00f3;n de memoria desde c&#x00f3;digo Java, as&#x00ed; que esto es lo mejor
+                    que podemos hacer sin usar JNI.
+                </para>
+            </sect3>
+
+            <sect3 id="mapping-declaration-id-sequences">
+            <title>Columnas de identidad y secuencias</title>
+                <para>
+                    Para las bases de datos que soportan columnas de identidad (DB2, MySQL, Sybase, MS SQL),
+                    puedes usar generaci&#x00f3;n de claves <literal>identity</literal>. Para las bases de datos
+                    que soportan secuencias (DB2, Oracle, PostgreSQL, Interbase, McKoi, SAP DB) puedes usar la generaci&#x00f3;n
+                    de claves del estilo <literal>sequence</literal>. Ambas estrategias requieren dos consultas SQL
+                    para insertar un nuevo objeto.
+                </para>
+
+                <programlisting><![CDATA[<id name="id" type="long" column="person_id">
+        <generator class="sequence">
+                <param name="sequence">person_id_sequence</param>
+        </generator>
+</id>]]></programlisting>
+
+                <programlisting><![CDATA[<id name="id" type="long" column="person_id" unsaved-value="0">
+        <generator class="identity"/>
+</id>]]></programlisting>
+            
+                <para>
+                    Para desarrollos multiplataforma, la estrategia <literal>native</literal>
+                    eiligir&#x00e1; de entre las estrategias <literal>identity</literal>,
+                    <literal>sequence</literal> y <literal>hilo</literal>, dependiendo de las capacidades
+                    de la base de datos subyacentes.
+                </para>
+            </sect3>
+            
+            <sect3 id="mapping-declaration-id-assigned">
+                <title>Identificadores asignados</title>
+                <para>
+                    Si quieres que la aplicaci&#x00f3;n asigne los identificadores (en contraposici&#x00f3;n
+                    a que los genere Hibernate), puedes usar el generador <literal>assigned</literal>.
+                    Este generador especial usar&#x00e1; el valor identificador ya asignado a la
+                    propiedad identificadora del objeto. Este generador se usa cuandola clave primaria es
+                    una clave natural en vez de una clave sustituta. Este es el comportamiento por defecto si
+                    no especificas un elemento <literal>&lt;generator&gt;</literal>.
+                </para>
+                
+                <para>
+                    Elegir el generador <literal>assigned</literal> hace que Hibernate use
+                    <literal>unsaved-value="undefined"</literal>, forzando a Hibernate a ir 
+                    a la base de datos para determinar si una instancia es transitoria o separada,
+                    a menos que haya una propiedad de versi&#x00f3;n o timestamp, o que tu definas 
+                    <literal>Interceptor.isUnsaved()</literal>.
+                </para>
+            </sect3>
+
+            <sect3 id="mapping-declaration-id-select">
+                <title>Claves primarias asignadas por disparadores</title>
+                <para>
+                    Para esquemas heredados solamente (Hibernate no genera DDL con disparadores).
+                </para>
+
+                <programlisting><![CDATA[<id name="id" type="long" column="person_id">
+        <generator class="select">
+                <param name="key">socialSecurityNumber</param>
+        </generator>
+</id>]]></programlisting>
+
+                <para>
+                    En el ejemplo de arriba, hay una propiedad &#x00e1;nica llamada
+                    <literal>socialSecurityNumber</literal> definida por la clase, como 
+                    una clave natural, y una clave sustituta llamada <literal>person_id</literal>
+                    cuyo valor es generado por un disparador.
+                </para>
+                
+            </sect3>
+
+        </sect2>
+
+        <sect2 id="mapping-declaration-compositeid" revision="2">
+            <title>composite-id</title>
+
+            <programlisting><![CDATA[<composite-id
+        name="propertyName"
+        class="ClassName"
+        unsaved-value="undefined|any|none"
+        access="field|property|ClassName"
+        node="element-name|.">
+
+        <key-property name="propertyName" type="typename" column="column_name"/>
+        <key-many-to-one name="propertyName class="ClassName" column="column_name"/>
+        ......
+</composite-id>]]></programlisting>
+
+            <para>
+                Para una tabla con clave compuesta, puedes mapear m&#x00fa;ltiples propiedades
+                de la clase como propiedades identificadoras. El elemento <literal>&lt;composite-id&gt;</literal>
+                acepta los mapeos de propiedad <literal>&lt;key-property&gt;</literal> y
+                los mapeos <literal>&lt;key-many-to-one&gt;</literal> como elementos hijo.
+            </para>
+            
+            <programlisting><![CDATA[<composite-id>
+        <key-property name="medicareNumber"/>
+        <key-property name="dependent"/>
+</composite-id>]]></programlisting>
+
+            <para>
+                Tu clase persistente <emphasis>debe</emphasis> sobreescribir <literal>equals()</literal>
+                y <literal>hashCode()</literal> para implementar igualdad de identificador compuesto.
+                Debe tambi&#x00e9;n implementar <literal>Serializable</literal>.
+            </para>
+
+            <para>
+                Desafortunadamente, este enfoque de identificadores compuestos significa que un objeto
+                persistente es su propio identificador. No existe otra "asa" conveniente m&#x00e1;s que el
+                objeto mismo. Debes instanciar una instancia de la clase misma y poblar sus propiedades
+                identificadoras antes que puedas <literal>load()</literal> el estado persistente asociado
+                a una clave compuesta. Describiremos un enfoque mucho m&#x00e1;s conveniente donde el identificador
+                compuesto est&#x00e1; implementado como una clase separada en <xref linkend="components-compositeid"/>.
+                Los atributos descriptos debajo solamente se aplican a este enfoque alternativo:
+            </para>
+
+            <itemizedlist spacing="compact">
+                <listitem>
+                    <para>
+                        <literal>name</literal> (opcional): Una propiedad de tipo componente que tiene el identificador
+                        compuesto (ver siguiente secci&#x00f3;n).
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <literal>class</literal> (opcional - por defecto al tipo de la propiedad determinado
+                        por reflecci&#x00f3;n): La clase del componente usado como identificador compuesto (ver siguiente secci&#x00f3;n).
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <literal>unsaved-value</literal> (opcional - por defecto a <literal>undefined</literal>): 
+                        Indica que las instancias transitorias deben ser consideradas como reci&#x00e9;n instanciadas,
+                        si se establece a <literal>any</literal>, o separadas, si se establece a <literal>none</literal>.
+                        Lo mejor
+                        
+                        Indicates that transient instances should be considered newly instantiated, if set 
+                        to <literal>any</literal>, or detached, if set to <literal>none</literal>.
+                        Lo mejor en todos los casos es dejar el valor por defecto.
+                    </para>
+                </listitem>
+            </itemizedlist>
+            
+        </sect2>
+        
+        <sect2 id="mapping-declaration-discriminator" revision="3">
+            <title>discriminator</title>
+
+            <para>
+                El elemento <literal>&lt;discriminator&gt;</literal> es requerido para la persistencia
+                polim&#x00f3;rfica usando la estrategia de mapeo de tabla-por-jerarqu&#x00ed;a-de-clases y
+                declara una columna discriminadora de la tabla. La columna discriminidora contiene valores
+                de marca que le dicen a la capa de persistencia qu&#x00e9; subclase instanciar para una fila
+                en particular. Un conjunto restringido de tipos puede ser usado:
+                <literal>string</literal>, <literal>character</literal>, <literal>integer</literal>, 
+                <literal>byte</literal>, <literal>short</literal>, <literal>boolean</literal>, 
+                <literal>yes_no</literal>, <literal>true_false</literal>.
+            </para>
+            
+            <programlistingco>
+                <areaspec>
+                    <area id="discriminator1" coords="2 60"/>
+                    <area id="discriminator2" coords="3 60" />
+                    <area id="discriminator3" coords="4 60" />
+                    <area id="discriminator4" coords="5 60" />
+                    <area id="discriminator5" coords="6 60" />
+                </areaspec>
+                <programlisting><![CDATA[<discriminator
+        column="discriminator_column"
+        type="discriminator_type"
+        force="true|false"
+        insert="true|false"
+        formula="arbitrary sql expression"
+/>]]></programlisting>
+                <calloutlist>
+                    <callout arearefs="discriminator1">
+                        <para>
+                            <literal>column</literal> (opcional - por defecto a <literal>class</literal>) el
+                            nombre de la columna discriminadora.
+                        </para>
+                    </callout>
+                    <callout arearefs="discriminator2">
+                        <para>
+                            <literal>type</literal> (opcional - por defecto a <literal>string</literal>) un
+                            nombre que indique el tipo Hibernate
+                        </para>
+                    </callout>          
+                    <callout arearefs="discriminator3">
+                        <para>
+                            <literal>force</literal> (optconal - por defecto a <literal>false</literal>) 
+                            "fuerza" a Hibernate a especificar valores discriminadores permitidos incluso
+                            cuando se recuperan todas las instancias de la clase ra&#x00ed;z.
+                        </para>
+                    </callout>          
+                    <callout arearefs="discriminator4">
+                        <para>
+                            <literal>insert</literal> (opcional - por defecto a <literal>true</literal>)
+                            establezca este a <literal>false</literal> si tu columna discriminadora es
+                            tambi&#x00e9;n parte de un identificador mapeado compuesto. (Le dice a Hibernate
+                            que no incluya la columna en los SQL <literal>INSERT</literal>s.)
+                        </para>
+                    </callout>
+                    <callout arearefs="discriminator5">
+                        <para>
+                            <literal>formula</literal> (opcional) una expresi&#x00f3;n SQL arbitraria que
+                            es ejecutada cuando un tipo tenga que ser evaluado. Permite dicriminaci&#x00f3;n
+                            basada en el contenido.
+                        </para>
+                    </callout>
+                </calloutlist>
+            </programlistingco>
+
+            <para>
+                Los valores reales de la columna discriminadora est&#x00e1;n especificados por
+                el atributo <literal>discriminator-value</literal> de los elementos
+                <literal>&lt;class&gt;</literal> y <literal>&lt;subclass&gt;</literal>.
+            </para>
+            
+            <para>
+                El atributo <literal>force</literal> es (s&#x00f3;lo) &#x00fa;til si la tabla contiene
+                filas con valores discriminadores "extra" que no est&#x00e1;n mapeados a la clase
+                persistente. Generalmente este no es el caso.
+            </para>
+
+            <para>
+                Usando el atributo <literal>formula</literal> puedes declarar una expresi&#x00f3;n SQL
+                arbitraria que ser&#x00e1; usada para evaluar el tipo de una fila:
+            </para>
+
+            <programlisting><![CDATA[<discriminator
+    formula="case when CLASS_TYPE in ('a', 'b', 'c') then 0 else 1 end"
+    type="integer"/>]]></programlisting>
+
+        </sect2>
+
+        <sect2 id="mapping-declaration-version" revision="1">
+            <title>version (opcional)</title>
+            
+            <para>
+                El elemento <literal>&lt;version&gt;</literal> es opcional e indica que la
+                tabla contiene datos versionados. Esto es particularmente &#x00fa;til si planeas
+                usar <emphasis>transacciones largas</emphasis> (ver debajo).
+            </para>
+            
+            <programlistingco>
+                <areaspec>
+                    <area id="version1" coords="2 70"/>
+                    <area id="version2" coords="3 70"/>
+                    <area id="version3" coords="4 70"/>
+                    <area id="version4" coords="5 70"/>
+                    <area id="version5" coords="6 70"/>
+                </areaspec>
+                <programlisting><![CDATA[<version
+        column="version_column"
+        name="propertyName"
+        type="typename"
+        access="field|property|ClassName"
+        unsaved-value="null|negative|undefined"
+        node="element-name|@attribute-name|element/@attribute|."
+/>]]></programlisting>
+                <calloutlist>
+                    <callout arearefs="version1">
+                        <para>
+                            <literal>column</literal> (opcional - por defecto al nombre de la propiedad): El nombre
+                            de la columna que tiene el n&#x00fa;mero de versi&#x00f3;n.
+                        </para>
+                    </callout>          
+                    <callout arearefs="version2">
+                        <para>
+                            <literal>name</literal>: El nombre de una propiedad de la clase persistente.
+                        </para>
+                    </callout>
+                    <callout arearefs="version3">
+                        <para>
+                            <literal>type</literal> (opcional - por defecto a <literal>integer</literal>): 
+                            El tipo del n&#x00fa;.mero de vesi&#x00f3;n.
+                        </para>
+                    </callout>          
+                   <callout arearefs="version4">
+                        <para>
+                            <literal>access</literal> (opcional - por defecto a <literal>property</literal>): La
+                            estrategia que Hibernate debe usar para acceder al valor de la propiedad.
+                        </para>
+                    </callout>
+                   <callout arearefs="version5">
+                        <para>
+                            <literal>unsaved-value</literal> (opcional - por defecto a <literal>undefined</literal>):
+                            Un valor de la propiedad de versi&#x00f3;n que indica que una instancia est&#x00e1;
+                            reci&#x00e9;n instanciada (sin guardar), distingui&#x00e9;ndola de instancias
+                            separadas que fueran guardadas o cargadas en una sesi&#x00f3;n previa.
+                            (<literal>undefined</literal> especifica que debe usarse el valor de la
+                            propiedad identificadora.)
+                        </para>
+                    </callout>
+                </calloutlist>
+            </programlistingco>
+            
+            <para>
+                Los n&#x00fa;meros de versi&#x00f3;n deben ser de tipo <literal>long</literal>,
+                <literal>integer</literal>, <literal>short</literal>, <literal>timestamp</literal> o
+                <literal>calendar</literal> de Hibernate.
+            </para>
+            
+            <para>
+                Una propiedad de versi&#x00f3;n o timestamp nunca debe ser nula para una instancia
+                separada, de modo que Hibernate detectar&#x00e1; cualquier instancia con una versi&#x00f3;n
+                o timestamp nulo como transitoria, sin importar qu&#x00e9; otras estrategias
+                <literal>unsaved-value</literal> se hayan especificado.
+                <emphasis>Declarar una propiedad de vers&#x00f3;n o timestamp nulable es una forma
+                f&#x00e1;cil de evitar cualquier problema con la re-uni&#x00f3;n transitiva en Hibernate,
+                especialmente &#x00fa;til para que usa identificadores asignados o claves compuestas!</emphasis>
+            </para>
+        </sect2>
+        
+        <sect2 id="mapping-declaration-timestamp">
+            <title>timestamp (opcional)</title>
+
+            <para>
+                El elemento opcional <literal>&lt;timestamp&gt;</literal> indica que la tabla contiene
+                datos con sellos de tiempo. Esto esta concebido como una alternativa al versionado.
+                Los timestamps (sellos de tiempo) son por su naturaleza una implementaci&#x00f3;n menos
+                segura de bloqueo optimista. Sin embrago, a veces la aplicaci&#x00f3;n puede usar los
+                timestamps en otras formas.
+            </para>
+            
+            <programlistingco>
+                <areaspec>
+                    <area id="timestamp1" coords="2 70"/>
+                    <area id="timestamp2" coords="3 70" />
+                    <area id="timestamp3" coords="4 70" />
+                    <area id="timestamp4" coords="5 70" />
+                </areaspec>            
+                <programlisting><![CDATA[<timestamp
+        column="timestamp_column"
+        name="propertyName"
+        access="field|property|ClassName"
+        unsaved-value="null|undefined"
+        node="element-name|@attribute-name|element/@attribute|."
+/>]]></programlisting>
+                <calloutlist>
+                    <callout arearefs="timestamp1">
+                        <para>
+                            <literal>column</literal> (opcional - por defecto al nombre de la propiedad): El nombre
+                            de una columna que tiene el timestamp.
+                        </para>
+                    </callout>                   
+                    <callout arearefs="timestamp2">
+                        <para>
+                            <literal>name</literal>: El nombre de una propiedad del estilo JavaBeans de tipo
+                            Java <literal>Date</literal> o <literal>Timestamp</literal> de la clase persistente.
+                        </para>
+                    </callout>
+                   <callout arearefs="timestamp3">
+                        <para>
+                            <literal>access</literal> (opcional - por defecto a <literal>property</literal>): La
+                            estrategia que Hibernate debe usar para acceder al valor de la propiedad.
+                        </para>
+                    </callout>
+                   <callout arearefs="timestamp4">
+                        <para>
+                            <literal>unsaved-value</literal> (opcional - por defecto a <literal>null</literal>): 
+                            Un valor de propiedad de versi&#x00f3;n que ind