hibernate-orm/doc/reference/fr/modules/toolset_guide.xml

595 lines
26 KiB
XML
Raw Normal View History

<?xml version="1.0" encoding="iso-8859-1"?>
<chapter id="toolsetguide" revision="2">
<title>Guide des outils</title>
<para>
Des outils en ligne de commande, des plugins Eclipse ainsu que des t<>ches Ant permettent de g<>rer de cycles de d<>veloppement complet
de projets utilisant Hibernate.
</para>
<para>
Les <emphasis>outils Hibernate</emphasis> actuels incluent des plugins pour l'IDE Eclipse ainsi que des t<>ches Ant pour l'ing<6E>nierie
inverse de bases de donn<6E>es existantes :
</para>
<itemizedlist>
<listitem><para>
<emphasis>Mapping Editor :</emphasis> un <20>diteur pour les fichiers de mapping XML Hibernate, supportant l'auto-compl<70>tion et la mise en valeur de la syntaxe.
Il supporte aussi l'auto-compl<70>tion automatique pour les noms de classes et les noms de propri<72>t<EFBFBD>/champ,
le rendant beaucoup plus polyvalent qu'un <20>diteurXML normal.
</para></listitem>
<listitem><para>
<emphasis>Console :</emphasis> la console est une nouvelle vue d'Eclipse. En plus de la vue d'ensemble
arborescente de vos configurations de console, vous obtenez aussi une vue interactive de vos classes persistantes et de leurs relations.
La console vous permet d'ex<65>cuter des requ<71>te HQL dans votre base de donn<6E>es et de parcourir les r<>sultats directement dans Eclipse.
</para></listitem>
<listitem><para>
<emphasis>Development Wizards :</emphasis> plusieurs assistants sont fournis avec les outils d'Hibernate
pour Eclipse ; vous pouvez utiliser un assistant pour g<>n<EFBFBD>rer rapidement les fichiers de configuration d'Hibernate (cfg.xml),
ou vous pouvez m<>me compl<70>tement g<>n<EFBFBD>rer les fichiers de mapping Hibernate et les sources des POJOs <20> partir d'un sch<63>ma de base de donn<6E>es existant.
L'assistant d'ing<6E>nierie inverse supporte les mod<6F>les utilisateur.
</para></listitem>
<listitem><para>
<emphasis>T<EFBFBD>ches Ant :</emphasis>
</para></listitem>
</itemizedlist>
<para>
Veuillez-vous r<>f<EFBFBD>rer au paquet <emphasis>outils Hibernate</emphasis> et sa documentation pour plus d'informations.
</para>
<para>
Pourtant, le paquet principal d'Hibernate arrive avec un lot d'outils int<6E>gr<67>s (il peut m<>me <20>tre utilis<69> de "l'int<6E>rieur" d'Hibernate <20> la vol<6F>e) :
<emphasis>SchemaExport</emphasis> aussi connu comme
<literal>hbm2ddl</literal>.
</para>
<sect1 id="toolsetguide-s1" revision="2">
<title>G<EFBFBD>n<EFBFBD>ration automatique du sch<63>ma</title>
<para>
La DDL peut <20>tre g<>n<EFBFBD>r<EFBFBD>e <20> partir de vos fichiers de mapping par un utilitaire d'Hibernate. Le sch<63>ma g<>n<EFBFBD>r<EFBFBD>
inclut les contraintes d'int<6E>grit<69> r<>f<EFBFBD>rentielle (clefs primaires et <20>trang<6E>res) pour les tables d'entit<69>s
et de collections. Les tables et les s<>quences sont aussi cr<63><72>es pour les g<>n<EFBFBD>rateurs d'identifiant mapp<70>s.
</para>
<para>
Vous <emphasis>devez</emphasis> sp<73>cifier un <literal>Dialect</literal> SQL via la propri<72>t<EFBFBD>
<literal>hibernate.dialect</literal> lors de l'utilisation de cet outils, puisque la DDL est
fortement d<>pendante de la base de donn<6E>es.
</para>
<para>
D'abord, personnalisez vos fichiers de mapping pour am<61>liorer le sch<63>ma g<>n<EFBFBD>r<EFBFBD>.
</para>
<sect2 id="toolsetguide-s1-2" revision="3">
<title>Personnaliser le sch<63>ma</title>
<para>
Plusieurs <20>l<EFBFBD>ments du mapping hibernate d<>finissent des attributs optionnels
nomm<6D>s <literal>length</literal>, <literal>precision</literal> et <literal>scale</literal>.
Vous pouvez param<61>trer la longueur, la pr<70>cision,... d'une colonne avec ces attributs.
</para>
<programlisting><![CDATA[<property name="zip" length="5"/>]]></programlisting>
<programlisting><![CDATA[<property name="balance" precision="12" scale="2"/>]]></programlisting>
<para>
Certains <20>l<EFBFBD>ments acceptent aussi un attribut <literal>not-null</literal>
(utilis<69> pour g<>n<EFBFBD>rer les contraintes de colonnes <literal>NOT NULL</literal>) et
un attribut <literal>unique</literal> (pour g<>n<EFBFBD>rer une contrainte de colonne
<literal>UNIQUE</literal>).
</para>
<programlisting><![CDATA[<many-to-one name="bar" column="barId" not-null="true"/>]]></programlisting>
<programlisting><![CDATA[<element column="serialNumber" type="long" not-null="true" unique="true"/>]]></programlisting>
<para>
Un attribut <literal>unique-key</literal> peut <20>tre utilis<69> pour grouper les colonnes
en une seule contrainte d'unicit<69>. Actuellement, la valeur sp<73>cifi<66>e par
l'attribut <literal>unique-key</literal> n'est <emphasis>pas</emphasis> utilis<69>e pour
nommer la contrainte dans le DDL g<>n<EFBFBD>r<EFBFBD>, elle sert juste <20> grouper les colonnes
dans le fichier de mapping.
</para>
<programlisting><![CDATA[<many-to-one name="org" column="orgId" unique-key="OrgEmployeeId"/>
<property name="employeeId" unique-key="OrgEmployee"/>]]></programlisting>
<para>
Un attribut <literal>index</literal> indique le nom d'un index qui sera
cr<63><72> en utilisant la ou les colonnes mapp<70>es. Plusieurs colonnes
peuvent <20>tre group<75>es dans un m<>me index, en sp<73>cifiant le m<>me
nom d'index.
</para>
<programlisting><![CDATA[<property name="lastName" index="CustName"/>
<property name="firstName" index="CustName"/>]]></programlisting>
<para>
Un attribut <literal>foreign-key</literal> peut <20>tre utilis<69> pour surcharger le nom
des cl<63>s <20>trang<6E>res g<>n<EFBFBD>r<EFBFBD>es.
</para>
<programlisting><![CDATA[<many-to-one name="bar" column="barId" foreign-key="FKFooBar"/>]]></programlisting>
<para>
Plusieurs <20>l<EFBFBD>ments de mapping acceptent aussi un <20>l<EFBFBD>ment fils <literal>&lt;column&gt;</literal>.
Ceci est utile pour les type multi-colonnes:
</para>
<programlisting><![CDATA[<property name="name" type="my.customtypes.Name"/>
<column name="last" not-null="true" index="bar_idx" length="30"/>
<column name="first" not-null="true" index="bar_idx" length="20"/>
<column name="initial"/>
</property>]]></programlisting>
<para>
L'attribut <literal>default</literal> vous laisse sp<73>cifier une valeur par d<>faut pour
une colonnes (vous devriez assigner la m<>me valeur <20> la propri<72>t<EFBFBD> mapp<70>e avant de sauvegarder une nouvelle instance
de la classe mapp<70>e).
</para>
<programlisting><![CDATA[<property name="credits" type="integer" insert="false">
<column name="credits" default="10"/>
</property>]]></programlisting>
<programlisting><![CDATA[<version name="version" type="integer" insert="false">
<column name="version" default="0"/>
</property>]]></programlisting>
<para>
L'attribut <literal>sql-type</literal> laisse l'utilisateur surcharger le mapping
par d<>faut du type Hibernate vers un type SQL.
</para>
<programlisting><![CDATA[<property name="balance" type="float">
<column name="balance" sql-type="decimal(13,3)"/>
</property>]]></programlisting>
<para>
L'attribut <literal>check</literal> permet de sp<73>cifier une contrainte de v<>rification.
</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>Summary</title>
<tgroup cols="3">
<colspec colwidth="1*"/>
<colspec colwidth="1*"/>
<colspec colwidth="2.5*"/>
<thead>
<row>
<entry>Attribut</entry>
<entry>Valeur</entry>
<entry>Interpr<EFBFBD>tation</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>length</literal></entry>
<entry>num<EFBFBD>rique</entry>
<entry>taille d'une colonne</entry>
</row>
<row>
<entry><literal>precision</literal></entry>
<entry>num<EFBFBD>rique</entry>
<entry>pr<EFBFBD>cision d<>cimale de la colonne</entry>
</row>
<row>
<entry><literal>scale</literal></entry>
<entry>num<EFBFBD>rique</entry>
<entry>scale d<>cimale de la colonne</entry>
</row>
<row>
<entry><literal>not-null</literal></entry>
<entry><literal>true|false</literal></entry>
<entry>sp<EFBFBD>cifie que la colonne doit <20>tre non-nulle</entry>
</row>
<row>
<entry><literal>unique</literal></entry>
<entry><literal>true|false</literal></entry>
<entry>sp<EFBFBD>cifie que la colonne doit avoir une contrainte d'unicit<69></entry>
</row>
<row>
<entry><literal>index</literal></entry>
<entry><literal>index_name</literal></entry>
<entry>sp<EFBFBD>cifie le nom d'un index (multi-colonnes)</entry>
</row>
<row>
<entry><literal>unique-key</literal></entry>
<entry><literal>unique_key_name</literal></entry>
<entry>sp<EFBFBD>cifie le nom d'une contrainte d'unicit<69> multi-colonnes</entry>
</row>
<row>
<entry><literal>foreign-key</literal></entry>
<entry><literal>foreign_key_name</literal></entry>
<entry>
sp<73>cifie le nom d'une contrainte de cl<63> <20>trang<6E>re g<>n<EFBFBD>r<EFBFBD>e pour
une association, utilisez-la avec les <20>l<EFBFBD>ments de mapping
&lt;one-to-one&gt;, &lt;many-to-one&gt;, &lt;key&gt;, et &lt;many-to-many&gt;
Notez que les extr<74>mit<69>s <literal>inverse="true"</literal>
se seront pas prises en compte par <literal>SchemaExport</literal>.
</entry>
</row>
<row>
<entry><literal>sql-type</literal></entry>
<entry><literal>SQL column_type</literal></entry>
<entry>
surcharge le type par d<>faut (attribut de
l'<27>l<EFBFBD>ment <literal>&lt;column&gt;</literal> uniquement)
</entry>
</row>
<row>
<entry><literal>default</literal></entry>
<entry>expression SQL</entry>
<entry>
sp<73>cifie une valeur par d<>faut pour la colonne
</entry>
</row>
<row>
<entry><literal>check</literal></entry>
<entry>SQL expression</entry>
<entry>
cr<63>e une contrainte de v<>rification sur la table ou la colonne
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
L'<27>l<EFBFBD>ment <literal>&lt;comment&gt;</literal> vous permet de sp<73>cifier un commentaire pour le sch<63>ma g<>n<EFBFBD>r<EFBFBD>.
</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>
Ceci a pour r<>sultat une expression
<literal>comment on table</literal> ou
<literal>comment on column</literal> dans la DDL g<>n<EFBFBD>r<EFBFBD>e (o<> support<72>e).
</para>
</sect2>
<sect2 id="toolsetguide-s1-3" revision="2">
<title>Ex<EFBFBD>cuter l'outil</title>
<para>
L'outil <literal>SchemaExport</literal> g<>n<EFBFBD>re un script DDL vers
la sortie standard et/ou ex<65>cute les ordres DDL.
</para>
<para>
<literal>java -cp </literal><emphasis>classpath_hibernate</emphasis>
<literal>net.sf.hibernate.tool.hbm2ddl.SchemaExport</literal> <emphasis>options fichiers_de_mapping</emphasis>
</para>
<table frame="topbot">
<title><literal>SchemaExport</literal> Options de la ligne de commande</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
<entry>Option</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>--quiet</literal></entry>
<entry>ne pas <20>crire le script vers la sortie standard</entry>
</row>
<row>
<entry><literal>--drop</literal></entry>
<entry>supprime seuleument les tables</entry>
</row>
<row>
<entry><literal>--create</literal></entry>
<entry>ne cr<63><72> que les tables</entry>
</row>
<row>
<entry><literal>--text</literal></entry>
<entry>ne pas ex<65>cuter sur la base de donn<6E>es</entry>
</row>
<row>
<entry><literal>--output=my_schema.ddl</literal></entry>
<entry><EFBFBD>crit le script ddl vers un fichier</entry>
</row>
<row>
<entry><literal>--naming=eg.MyNamingStrategy</literal></entry>
<entry>s<EFBFBD>lectionne une <literal>NamingStrategy</literal></entry>
</row>
<row>
<entry><literal>--config=hibernate.cfg.xml</literal></entry>
<entry>lit la configuration Hibernate <20> partir d'un fichier XML</entry>
</row>
<row>
<entry><literal>--properties=hibernate.properties</literal></entry>
<entry>lit les propri<72>t<EFBFBD>s de la base de donn<6E>es <20> partir d'un fichier</entry>
</row>
<row>
<entry><literal>--format</literal></entry>
<entry>formatte proprement le SQL g<>n<EFBFBD>r<EFBFBD> dans le script</entry>
</row>
<row>
<entry><literal>--delimiter=x</literal></entry>
<entry>param<EFBFBD>tre un d<>limiteur de fin de ligne pour le script</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Vous pouvez m<>me int<6E>grer <literal>SchemaExport</literal> dans votre application :
</para>
<programlisting><![CDATA[Configuration cfg = ....;
new SchemaExport(cfg).create(false, true);]]></programlisting>
</sect2>
<sect2 id="toolsetguide-s1-4">
<title>Propri<EFBFBD>t<EFBFBD>s</title>
<para>
Les propri<72>t<EFBFBD>s de la base de donn<6E>es peuvent <20>tre sp<73>cifi<66>es
</para>
<itemizedlist spacing="compact">
<listitem>
<para>comme propri<72>t<EFBFBD>s syst<73>me avec <literal>-D</literal><emphasis>&lt;property&gt;</emphasis></para>
</listitem>
<listitem>
<para>dans <literal>hibernate.properties</literal></para>
</listitem>
<listitem>
<para>dans un fichier de propri<72>t<EFBFBD>s d<>clar<61> avec <literal>--properties</literal></para>
</listitem>
</itemizedlist>
<para>
Les propri<72>t<EFBFBD>s n<>cessaires sont :
</para>
<table frame="topbot">
<title>SchemaExport Connection Properties</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
<entry>Nom de la propri<72>t<EFBFBD></entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>hibernate.connection.driver_class</literal></entry>
<entry>classe du driver JDBC</entry>
</row>
<row>
<entry><literal>hibernate.connection.url</literal></entry>
<entry>URL JDBC</entry>
</row>
<row>
<entry><literal>hibernate.connection.username</literal></entry>
<entry>utilisateur de la base de donn<6E>es</entry>
</row>
<row>
<entry><literal>hibernate.connection.password</literal></entry>
<entry>mot de passe de l'utilisateur</entry>
</row>
<row>
<entry><literal>hibernate.dialect</literal></entry>
<entry>dialecte</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="toolsetguide-s1-5">
<title>Utiliser Ant</title>
<para>
Vous pouvez appeler <literal>SchemaExport</literal> depuis votre script
de construction 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" revision="2">
<title>Mises <20> jour incr<63>mentales du sch<63>ma</title>
<para>
L'outil <literal>SchemaUpdate</literal> mettra <20> jour un sch<63>ma existant
en effectuant les changement par "incr<63>ment".
Notez que <literal>SchemaUpdate</literal> d<>pends beaucoup de l'API JDBC
metadata, il ne fonctionnera donc pas avec tous les drivers JDBC.
</para>
<para>
<literal>java -cp </literal><emphasis>classpath_hibernate</emphasis>
<literal>net.sf.hibernate.tool.hbm2ddl.SchemaUpdate</literal> <emphasis>options fichiers_de_mapping</emphasis>
</para>
<table frame="topbot">
<title><literal>SchemaUpdate</literal> Options de ligne de commande</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
<entry>Option</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>--quiet</literal></entry>
<entry>ne pas <20>crire vers la sortie standard</entry>
</row>
<row>
<entry><literal>--text</literal></entry>
<entry>ne pas exporter vers la base de donn<6E>es</entry>
</row>
<row>
<entry><literal>--naming=eg.MyNamingStrategy</literal></entry>
<entry>choisit une <literal>NamingStrategy</literal></entry>
</row>
<row>
<entry><literal>--properties=hibernate.properties</literal></entry>
<entry>lire les propri<72>t<EFBFBD>s de la base de donn<6E>es <20> partir d'un fichier</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Vous pouvez int<6E>grer <literal>SchemaUpdate</literal> dans votre application :
</para>
<programlisting><![CDATA[Configuration cfg = ....;
new SchemaUpdate(cfg).execute(false);]]></programlisting>
</sect2>
<sect2 id="toolsetguide-s1-7">
<title>Utiliser Ant pour des mises <20> jour de sch<63>ma par incr<63>ment</title>
<para>
Vous pouvez appeler <literal>SchemaUpdate</literal> depuis le script 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 id="toolsetguide-s1-8" revision="1">
<title>Validation du sch<63>ma</title>
<para>
L'outil <literal>SchemaValidator</literal> validera que le sch<63>ma existant correspond <20> vos documents de mapping.
Notez que le <literal>SchemaValidator</literal> d<>pends de l'API metadata de JDBC, il ne fonctionnera
donc pas avec tous les drivers JDBC. Cet outil est extr<74>mement utile pour tester.
</para>
<para>
<literal>java -cp </literal><emphasis>hibernate_classpaths</emphasis>
<literal>org.hibernate.tool.hbm2ddl.SchemaValidator</literal> <emphasis>options mapping_files</emphasis>
</para>
<table frame="topbot">
<title><literal>SchemaValidator</literal> Options de ligne de commande</title>
<tgroup cols="2">
<colspec colwidth="1.5*"/>
<colspec colwidth="2*"/>
<thead>
<row>
<entry>Option</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>--naming=eg.MyNamingStrategy</literal></entry>
<entry>Indique une <literal>NamingStrategy</literal></entry>
</row>
<row>
<entry><literal>--properties=hibernate.properties</literal></entry>
<entry>lit les propri<72>t<EFBFBD>s dela base de donn<6E>es depuis un fichier de propri<72>t<EFBFBD>s</entry>
</row>
<row>
<entry><literal>--config=hibernate.cfg.xml</literal></entry>
<entry>indique un fichier <literal>.cfg.xml</literal></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Vous pouvez inclure <literal>SchemaValidator</literal> dans votre application:
</para>
<programlisting><![CDATA[Configuration cfg = ....;
new SchemaValidator(cfg).validate();]]></programlisting>
</sect2>
</sect2>
<sect2 id="toolsetguide-s1-9">
<title>Utiliser Ant pour la validation du Sch<63>ma</title>
<para>
Vous pouvez appeler <literal>SchemaValidator</literal> depuis le script Ant:
</para>
<programlisting><![CDATA[<target name="schemavalidate">
<taskdef name="schemavalidator"
classname="org.hibernate.tool.hbm2ddl.SchemaValidatorTask"
classpathref="class.path"/>
<schemavalidator
properties="hibernate.properties">
<fileset dir="src">
<include name="**/*.hbm.xml"/>
</fileset>
</schemaupdate>
</target>]]></programlisting>
</sect2>
</sect1>
</chapter>