460 lines
20 KiB
XML
460 lines
20 KiB
XML
<chapter id="toolsetguide" revision="2">
|
|
<title>Guía del Conjunto de Herramientas</title>
|
|
|
|
<para>
|
|
La ingeniería de ida y vuelta con Hibernate es posible usando un conjunto de plugins de Eclipse,
|
|
herramientas de línea de comandos, así como tareas de Ant.
|
|
</para>
|
|
|
|
<para>
|
|
Las <emphasis>Herramientas de Hibernate</emphasis> actualmente incluyen plugins para la IDE de
|
|
Eclipse así como tareas de Ant para la ingeniería inversa de bases de datos existentes:
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
<listitem><para>
|
|
<emphasis>Editor de Mapeo:</emphasis> Un editor de ficheros de mapeo XML, que soporta autocompleción
|
|
y resaltado de sintáxis. Soporta también autocompleción semántica de nombres de clases y nombres de
|
|
campos/propiedades, haciéndolo mucho más versátil que un editor de XML normal.
|
|
</para></listitem>
|
|
<listitem><para>
|
|
<emphasis>Consola:</emphasis> La consola es una nueva vista en Eclipse. Además de la vista de
|
|
árbol de tus configuraciones de consola, tienes también una vista interactiva de tus clases
|
|
persistentes y sus relaciones. La console te permite ejecutar consultas HQL contra tu base de datos y
|
|
navegar el resultado directamente en Eclipse.
|
|
</para></listitem>
|
|
<listitem><para>
|
|
<emphasis>Asistentes de Desarrollo:</emphasis> Se proveen muchos asistentes con las herramientas
|
|
de Eclipse. Puedes usar un asistente para generar rápidamente ficheros de configuración de Hibernate
|
|
(cfg.xml), o incluso puedes haceruna ingeniería inversa completa de un esquema de base de datos existente
|
|
en ficheros de código de POJO y ficheros de mapeo de Hibernate. El asistente de ingeniería inversa soporta
|
|
plantillas personalizables.
|
|
</para></listitem>
|
|
<listitem><para>
|
|
<emphasis>Tareas de Ant:</emphasis>
|
|
</para></listitem>
|
|
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
Por favor refiérete al paquete <emphasis>Herramientas de Hibernate</emphasis> y su documentación para
|
|
más información.
|
|
</para>
|
|
|
|
<para>
|
|
Sin embargo, el paquete principal de Hibernate viene incluyendo una herramienta integrada
|
|
(puede ser usada incluso "dentro" de Hibernate on-the-fly): <emphasis>SchemaExport</emphasis>
|
|
también conocido como <literal>hbm2ddl</literal>.
|
|
</para>
|
|
|
|
<sect1 id="toolsetguide-s1" revision="2">
|
|
<title>Generación automática de esquemas</title>
|
|
|
|
<para>
|
|
Una utilidad de Hibernate puede generar DDL desde tus ficheros de mapeo. El esquema generado incluye
|
|
restricciones de integridad referencial (claves primarias y foráneas) para las tablas de entidades y
|
|
colecciones. Las tablas y secuencias también son creadas para los generadores de identificadores mapeados.
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis>Debes</emphasis> especificar un <literal>Dialecto</literal> SQL vía la propiedad
|
|
<literal>hibernate.dialect</literal> al usar esta herramienta, ya que el DDL es altamente específico del
|
|
vendedor.
|
|
</para>
|
|
|
|
<para>
|
|
First, customize your mapping files to improve the generated schema.
|
|
</para>
|
|
|
|
<sect2 id="toolsetguide-s1-2" revision="1">
|
|
<title>Personalizando el esquema</title>
|
|
|
|
<para>
|
|
Muchos elementos de mapeo de Hibernate definen un atributo opcional llamado <literal>length</literal>.
|
|
Con este atributo puedes establecer el tamaño de una columna. (O, para tipos de datos
|
|
numéricos/decimales, la precisión.)
|
|
</para>
|
|
|
|
<para>
|
|
Algunas etiquetas también aceptan un atributo <literal>not-null</literal> (para generar una restricción
|
|
<literal>NOT NULL</literal> en columnas de tablas) y y un atributo <literal>unique</literal> (para generar
|
|
restricciones <literal>UNIQUE</literal> en columnas de tablas).
|
|
</para>
|
|
|
|
<para>
|
|
Algunas etiquetas aceptan un atributo <literal>index</literal> para especificar el nombre de un índice
|
|
para esa columna. Se puede usar un atributo <literal>unique-key</literal> para agrupar columnas en una
|
|
restricción de clave de una sola unidad. Actualmente, el valor especificado del atributo
|
|
<literal>unique-key</literal> <emphasis>no</emphasis> es usado para nombrar la restricción, sólo para
|
|
agrupar las columnas en el fichero de mapeo.
|
|
</para>
|
|
|
|
<para>
|
|
Ejemplos:
|
|
</para>
|
|
|
|
<programlisting><![CDATA[<property name="foo" type="string" length="64" not-null="true"/>
|
|
|
|
<many-to-one name="bar" foreign-key="fk_foo_bar" not-null="true"/>
|
|
|
|
<element column="serial_number" type="long" not-null="true" unique="true"/>]]></programlisting>
|
|
|
|
<para>
|
|
Alternativamente, estos elementos aceptan tambíen un elemento hijo <literal><column></literal>.
|
|
Esto es particularmente útil para tipos multicolumnas:
|
|
</para>
|
|
|
|
<programlisting><![CDATA[<property name="foo" type="string">
|
|
<column name="foo" length="64" not-null="true" sql-type="text"/>
|
|
</property>]]></programlisting>
|
|
|
|
<programlisting><![CDATA[<property name="bar" type="my.customtypes.MultiColumnType"/>
|
|
<column name="fee" not-null="true" index="bar_idx"/>
|
|
<column name="fi" not-null="true" index="bar_idx"/>
|
|
<column name="fo" not-null="true" index="bar_idx"/>
|
|
</property>]]></programlisting>
|
|
|
|
<para>
|
|
El atributo <literal>sql-type</literal> permite al usuario sobrescribir el mapeo por defecto de
|
|
tipo Hibernate a tipo de datos SQL.
|
|
</para>
|
|
|
|
<para>
|
|
El atributo <literal>check</literal> te permite especificar una comprobación de restricción.
|
|
</para>
|
|
|
|
<programlisting><![CDATA[<property name="foo" type="integer">
|
|
<column name="foo" check="foo > 10"/>
|
|
</property>]]></programlisting>
|
|
|
|
<programlisting><![CDATA[<class name="Foo" table="foos" check="bar < 100.0">
|
|
...
|
|
<property name="bar" type="float"/>
|
|
</class>]]></programlisting>
|
|
|
|
|
|
<table frame="topbot" id="schemattributes-summary" revision="2">
|
|
<title>Resumen</title>
|
|
<tgroup cols="3">
|
|
<colspec colwidth="1*"/>
|
|
<colspec colwidth="1*"/>
|
|
<colspec colwidth="2.5*"/>
|
|
<thead>
|
|
<row>
|
|
<entry>Atributo</entry>
|
|
<entry>Valores</entry>
|
|
<entry>Interpretación</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>length</literal></entry>
|
|
<entry>number</entry>
|
|
<entry>largo de columna/precisión decimal</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>not-null</literal></entry>
|
|
<entry><literal>true|false</literal></entry>
|
|
<entry>especifica que la columna debe ser no nulable</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>unique</literal></entry>
|
|
<entry><literal>true|false</literal></entry>
|
|
<entry>especifica que la columna debe tener una restricción de unicidad</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>index</literal></entry>
|
|
<entry><literal>index_name</literal></entry>
|
|
<entry>especifica el nombre de un índice (multicolumna)</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>unique-key</literal></entry>
|
|
<entry><literal>unique_key_name</literal></entry>
|
|
<entry>especifica el nombre de una restricción de unicidad multicolumna</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>foreign-key</literal></entry>
|
|
<entry><literal>foreign_key_name</literal></entry>
|
|
<entry>
|
|
especifica el nombre de la restricción de clave foránea generada por una
|
|
asociación, úsalo en los elementos de mapeo <one-to-one>, <many-to-one>,
|
|
<key>, y <many-to-many>. Nota que los lados
|
|
<literal>inverse="true"</literal> no serán considerados por
|
|
<literal>SchemaExport</literal>.
|
|
</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>sql-type</literal></entry>
|
|
<entry><literal>column_type</literal></entry>
|
|
<entry>
|
|
sobrescribe el tipo de columna por defecto (sólo atributo del elemento
|
|
<literal><column></literal>)
|
|
</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>check</literal></entry>
|
|
<entry>expresión SQL</entry>
|
|
<entry>
|
|
crea una restricción de comprobación SQL en columna o tabla
|
|
</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<para>
|
|
El elemento <literal><comment></literal> te permite especificar un comentario para el esquema
|
|
generado.
|
|
</para>
|
|
|
|
<programlisting><![CDATA[<class name="Customer" table="CurCust">
|
|
<comment>Current customers only</comment>
|
|
...
|
|
</class>]]></programlisting>
|
|
|
|
<programlisting><![CDATA[<property name="balance">
|
|
<column name="bal">
|
|
<comment>Balance in USD</comment>
|
|
</column>
|
|
</property>]]></programlisting>
|
|
|
|
<para>
|
|
Esto resulta en una sentencia <literal>comment on table</literal> o <literal>comment on column</literal>
|
|
en el DDL generado (donde esté soportado).
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="toolsetguide-s1-3">
|
|
<title>Ejecutando la herramienta</title>
|
|
|
|
<para>
|
|
La herramienta <literal>SchemaExport</literal> escribe un guión DDL a la salida estándar y/o
|
|
ejecuta las sentencias DDL.
|
|
</para>
|
|
|
|
<para>
|
|
<literal>java -cp </literal><emphasis>classpaths_de_hibernate</emphasis>
|
|
<literal>org.hibernate.tool.hbm2ddl.SchemaExport</literal> <emphasis>opciones ficheros_de_mapeo</emphasis>
|
|
</para>
|
|
|
|
<table frame="topbot">
|
|
<title>Opciones de Línea de Comandos de <literal>SchemaExport</literal></title>
|
|
<tgroup cols="2">
|
|
<colspec colwidth="1.5*"/>
|
|
<colspec colwidth="2*"/>
|
|
<thead>
|
|
<row>
|
|
<entry>Opción</entry>
|
|
<entry>Descripción</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>--quiet</literal></entry>
|
|
<entry>no enviar a salida estándar el guión</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--drop</literal></entry>
|
|
<entry>sólo desechar las tablas</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--text</literal></entry>
|
|
<entry>no exportar a la base de datos</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--output=my_schema.ddl</literal></entry>
|
|
<entry>enviar la salida del guión ddl a un fichero</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--config=hibernate.cfg.xml</literal></entry>
|
|
<entry>lee la configuración de Hibernate de un fichero XML</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--properties=hibernate.properties</literal></entry>
|
|
<entry>lee las propiedades de base de datos de un fichero</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--format</literal></entry>
|
|
<entry>formatea agradablemente el SQL generado en el guión</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--delimiter=x</literal></entry>
|
|
<entry>establece un delimitador de fin de línea para el guión</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<para>
|
|
Puedes incluso encajar <literal>SchemaExport</literal> en tu aplicación:
|
|
</para>
|
|
|
|
<programlisting><![CDATA[Configuration cfg = ....;
|
|
new SchemaExport(cfg).create(false, true);]]></programlisting>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="toolsetguide-s1-4">
|
|
<title>Propiedades</title>
|
|
|
|
<para>
|
|
Las propiedades de base de datos pueden especificarse
|
|
</para>
|
|
|
|
<itemizedlist spacing="compact">
|
|
<listitem>
|
|
<para>como propiedades de sistema con <literal>-D</literal><emphasis><property></emphasis></para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>en <literal>hibernate.properties</literal></para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>en un fichero de propiedades mencionado con <literal>--properties</literal></para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
Las propiedades necesarias son:
|
|
</para>
|
|
|
|
<table frame="topbot">
|
|
<title>Propiedades de Conexión de SchemaExport</title>
|
|
<tgroup cols="2">
|
|
<colspec colwidth="1.5*"/>
|
|
<colspec colwidth="2*"/>
|
|
<thead>
|
|
<row>
|
|
<entry>Nombre de Propiedad</entry>
|
|
<entry>Descripción</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>hibernate.connection.driver_class</literal></entry>
|
|
<entry>clase del driver jdbc</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>hibernate.connection.url</literal></entry>
|
|
<entry>url de jdbc</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>hibernate.connection.username</literal></entry>
|
|
<entry>usuario de base de datos</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>hibernate.connection.password</literal></entry>
|
|
<entry>contraseña de usuario</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>hibernate.dialect</literal></entry>
|
|
<entry>dialecto</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="toolsetguide-s1-5">
|
|
<title>Usando Ant</title>
|
|
|
|
<para>
|
|
Puedes llamar a <literal>SchemaExport</literal> desde tu guión de construcción de Ant:
|
|
</para>
|
|
|
|
<programlisting><![CDATA[<target name="schemaexport">
|
|
<taskdef name="schemaexport"
|
|
classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"
|
|
classpathref="class.path"/>
|
|
|
|
<schemaexport
|
|
properties="hibernate.properties"
|
|
quiet="no"
|
|
text="no"
|
|
drop="no"
|
|
delimiter=";"
|
|
output="schema-export.sql">
|
|
<fileset dir="src">
|
|
<include name="**/*.hbm.xml"/>
|
|
</fileset>
|
|
</schemaexport>
|
|
</target>]]></programlisting>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="toolsetguide-s1-6">
|
|
<title>Actualizaciones incrementales de esquema</title>
|
|
|
|
<para>
|
|
La herramienta <literal>SchemaUpdate</literal> actualizará un esquema existente con cambios
|
|
"incrementales". Nota que <literal>SchemaUpdate</literal> depende fuertemente de la API de metadatos
|
|
de JDBC, de modo que no funcionará con todos los drivers JDBC.
|
|
</para>
|
|
|
|
<para>
|
|
<literal>java -cp </literal><emphasis>classpaths_de_hibernate</emphasis>
|
|
<literal>org.hibernate.tool.hbm2ddl.SchemaUpdate</literal> <emphasis>opciones ficheros_de_mapeo</emphasis>
|
|
</para>
|
|
|
|
<table frame="topbot">
|
|
<title>Opciones de Línea de Comandos de <literal>SchemaUpdate</literal></title>
|
|
<tgroup cols="2">
|
|
<colspec colwidth="1.5*"/>
|
|
<colspec colwidth="2*"/>
|
|
<thead>
|
|
<row>
|
|
<entry>Opción</entry>
|
|
<entry>Descripción</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>--quiet</literal></entry>
|
|
<entry>no enviar a salida estándar el guión</entry>
|
|
</row>
|
|
<row>
|
|
<entry><literal>--properties=hibernate.properties</literal></entry>
|
|
<entry>lee las propiedades de base de datos de un fichero</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<para>
|
|
Puedes encajar <literal>SchemaUpdate</literal> en tu aplicación:
|
|
</para>
|
|
|
|
<programlisting><![CDATA[Configuration cfg = ....;
|
|
new SchemaUpdate(cfg).execute(false);]]></programlisting>
|
|
|
|
</sect2>
|
|
|
|
<sect2 id="toolsetguide-s1-7">
|
|
<title>Usando Ant para actualizaciones incrementales de esquema</title>
|
|
|
|
<para>
|
|
Puedes llamar a <literal>SchemaUpdate</literal> desde el guión de Ant:
|
|
</para>
|
|
|
|
<programlisting><![CDATA[<target name="schemaupdate">
|
|
<taskdef name="schemaupdate"
|
|
classname="org.hibernate.tool.hbm2ddl.SchemaUpdateTask"
|
|
classpathref="class.path"/>
|
|
|
|
<schemaupdate
|
|
properties="hibernate.properties"
|
|
quiet="no">
|
|
<fileset dir="src">
|
|
<include name="**/*.hbm.xml"/>
|
|
</fileset>
|
|
</schemaupdate>
|
|
</target>]]></programlisting>
|
|
|
|
</sect2>
|
|
|
|
</sect1>
|
|
|
|
</chapter>
|
|
|