Author: AnthonyHib
Date: 2006-10-02 14:27:05 -0400 (Mon, 02 Oct 2006)
New Revision: 10541
Modified:
branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml
Log:
update for 3.2 doc compliance
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml 2006-10-02 18:02:18 UTC
(rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml 2006-10-02 18:27:05 UTC
(rev 10541)
@@ -33,7 +33,7 @@
<bookinfo>
<title>HIBERNATE - Persistance relationnelle en Java
standard</title>
<subtitle>Documentation de r�f�rence d'Hibernate</subtitle>
- <releaseinfo>3.1final</releaseinfo>
+ <releaseinfo>3.2final</releaseinfo>
</bookinfo>
<toc/>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -270,7 +270,7 @@
</para>
</sect1>
- <sect1 id="architecture-current-session" revision="1">
+ <sect1 id="architecture-current-session" revision="2">
<title>Sessions Contextuelles</title>
<para>
Certaines applications utilisant Hibernate ont besoin d'une sorte de
session "contextuelle", o�
@@ -321,6 +321,14 @@
courantes sont associ�es au thread d'ex�cution. Voir les javadocs
pour les d�tails.
</para>
</listitem>
+ <listitem>
+ <para>
+
<literal>org.hibernate.context.ManagedSessionContext</literal> - les sessions
+ courantes sont traqu�es par l'ex�cution du thread. Toutefois,
vous �tes responsable
+ de lier et d�lier une instance de
<literal>Session</literal> avec les m�thodes
+ statiques de cette classes, qui n'ouvre, ne flush ou ne ferme
jamais de <literal>Session</literal>.
+ </para>
+ </listitem>
</itemizedlist>
<para>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -86,7 +86,8 @@
qui agissent sur le sch�ma de base de donn�es export� par l'outil de
g�n�ration de sch�ma. (Par exemple l'attribut
<literal>not-null</literal>.)
</para>
- <sect2 id="mapping-declaration-doctype" revision="2">
+
+ <sect2 id="mapping-declaration-doctype" revision="3">
<title>Doctype</title>
<para>
Tous les mappings XML devraient utiliser le doctype indiqu�.
@@ -96,6 +97,56 @@
des recherches de la DTD sur Internet, v�rifiez votre d�claration de DTD
par rapport
au contenu de votre classpath.
</para>
+
+ <sect3 id="mapping-declaration-entity-resolution">
+ <title>EntityResolver</title>
+ <para>
+ Comme cit� pr�c�demment, Hibernate tentera de trouver les DTDs
d'abord dans son classpath. Il
+ r�ussit � faire cela en utilisant une impl�mentation particuli�re de
<literal>org.xml.sax.EntityResolver</literal>
+ avec le SAXReader qu'il utilise pour lire les fichiers xml. Cet
<literal>EntityResolver</literal> particulier
+ reconnait deux espaces de nommage systemId diff�rents.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ un <literal>espace de nommage hibernate</literal>
est reconnu d�s qu'un systemId commence par
+
<
literal>http://hibernate.sourceforge.net/</literal>; alors ces entit�s sont
r�solues via le
+ classloader qui a charg� les classes Hibernate.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ un <literal>espace de nommage
utilisateur</literal> est reconnu d�s qu'un systemId utilise
+ un protocol URL <literal>classpath://</literal>.
Le r�solveur tentera de r�soudre ces entit�s
+ via (1) le classloader du contexte du thread courant et (2)
le classloader qui a charg�
+ les classes Hibernate.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Un exemple d'utilisation de l'espace de nommage utilisateur:
+ </para>
+ <programlisting><![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" [
+ <!ENTITY types SYSTEM "classpath://your/domain/types.xml">
+]>
+
+<hibernate-mapping package="your.domain">
+ <class name="MyEntity">
+ <id name="id" type="my-custom-id-type">
+ ...
+ </id>
+ <class>
+ &types;
+</hibernate-mapping>]]></programlisting>
+ <para>
+ O� <literal>types.xml</literal> est une ressource dans le
package <literal>your.domain</literal>
+ et qui contient un <xref
linkend="mapping-types-custom">typedef</xref> particulier.
+ </para>
+ </sect3>
+
</sect2>
<sect2 id="mapping-declaration-mapping" revision="3">
<title>hibernate-mapping</title>
@@ -1103,7 +1154,7 @@
utilisent des identifiants assign�s ou des clefs compos�es
!</emphasis>
</para>
</sect2>
- <sect2 id="mapping-declaration-timestamp" revision="3"
>
+ <sect2 id="mapping-declaration-timestamp" revision="4"
>
<title>timestamp (optionnel)</title>
<para>
L'�l�ment optionnel
<literal><timestamp></literal> indique que la table contient des
donn�es
@@ -1179,7 +1230,9 @@
</programlistingco>
<para>
Notez que <literal><timestamp></literal> est
�quivalent �
- <literal><version
type="timestamp"></literal>.
+ <literal><version
type="timestamp"></literal> et
+ <literal><timestamp
source="db"></literal> �quivaut �
+ <literal><version
type="dbtimestamp"></literal>.
</para>
</sect2>
<sect2 id="mapping-declaration-property" revision="4">
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml 2006-10-02 18:02:18
UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml 2006-10-02 18:27:05
UTC (rev 10541)
@@ -33,6 +33,12 @@
<programlisting><![CDATA[hibernate.jdbc.batch_size
20]]></programlisting>
+ <para id="disablebatching" revision="1">
+ Notez qu'Hibernate d�sactive, de mani�re transparente, l'insertion par
paquet au
+ niveau JDBC si vous utilisez un g�n�rateur d'identifiant de type
+ <literal>identity</literal>.
+ </para>
+
<para>
Vous pourriez aussi vouloir faire cette sorte de travail dans un traitement o�
l'interaction avec le cache de second niveau est compl�tement d�sactiv� :
@@ -150,7 +156,7 @@
</sect1>
- <sect1 id="batch-direct" revision="2">
+ <sect1 id="batch-direct" revision="3">
<title>Op�rations de style DML</title>
<para>
@@ -218,10 +224,34 @@
session.close();]]></programlisting>
<para>
- Pour ex�cuter un <literal>DELETE</literal> HQL, utilisez la m�me
m�thode
- <literal>Query.executeUpdate()</literal> :
+ Par d�faut, les statements HQL <literal>UPDATE</literal>,
n'affectent pas la valeur des propri�t�s
+ <xref
linkend="mapping-declaration-version">version</xref> ou
+ <xref
linkend="mapping-declaration-timestamp">timestamp</xref>
+ pour les entit�s affect�es; ceci est compatible avec la spec EJB3.
Toutefois,
+ vous pouvez forcer Hibernate � mettre � jour les valeurs des propri�t�s
+ <literal>version</literal> ou <literal>timestamp</literal> en
utilisant le <literal>versioned update</literal>.
+ Pour se faire, ajoutez le mot cl� <literal>VERSIONED</literal>
apr�s le mot cl� <literal>UPDATE</literal>.
</para>
+<programlisting><![CDATA[Session session = sessionFactory.openSession();
+Transaction tx = session.beginTransaction();
+String hqlVersionedUpdate = "update versioned Customer set name = :newName where
name = :oldName";
+int updatedEntities = s.createQuery( hqlUpdate )
+ .setString( "newName", newName )
+ .setString( "oldName", oldName )
+ .executeUpdate();
+tx.commit();
+session.close();]]></programlisting>
+
+ <para>
+ Notez que les types personnalis�s
(<literal>org.hibernate.usertype.UserVersionType</literal>)
+ ne sont pas support�s en conjonction avec le statement <literal>update
versioned</literal> statement.
+ </para>
+
+ <para>
+ Pour ex�cuter un HQL <literal>DELETE</literal>, utilisez la m�me
m�thode<literal>Query.executeUpdate()</literal>:
+ </para>
+
<programlisting><![CDATA[Session session =
sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -938,7 +938,7 @@
</tgroup>
</table>
- <table frame="topbot" id="configuration-misc-properties"
revision="9">
+ <table frame="topbot" id="configuration-misc-properties"
revision="10">
<title>Propri�t�s diverses</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
@@ -962,7 +962,7 @@
<para>
<emphasis
role="strong">eg.</emphasis>
<literal>jta</literal> |
<literal>thread</literal> |
- <literal>custom.Class</literal>
+ <literal>managed</literal> |
<literal>custom.Class</literal>
</para>
</entry>
</row>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml 2006-10-02 18:02:18
UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml 2006-10-02 18:27:05
UTC (rev 10541)
@@ -8,7 +8,7 @@
fonctionnalit�s g�n�riques, et d'extensions de fonctionnalit�s
d'Hibernate.
</para>
- <sect1 id="objectstate-interceptors" revision="2">
+ <sect1 id="objectstate-interceptors" revision="3">
<title>Intercepteurs</title>
<para>
@@ -115,21 +115,32 @@
}]]></programlisting>
<para>
- L'intercepteur doit �tre sp�cifi� quand une session est cr��e.
+ Il y a deux types d'intercepteurs: li� � la
<literal>Session</literal> et
+ li� � la <literal>SessionFactory</literal>.
</para>
+ <para>
+ Un intercepteur li� � la <literal>Session</literal> est d�fini
+ lorsqu'une session est ouverte via l'invocation des m�thodes
surcharg�es SessionFactory.openSession()
+ acceptant un <literal>Interceptor</literal> (comme argument).
+ </para>
<programlisting><![CDATA[Session session = sf.openSession( new
AuditInterceptor() );]]></programlisting>
<para>
- Vous pouvez aussi mettre un intercepteur au niveau global, en utilisant
l'objet <literal>Configuration</literal>.
- Dans ce cas, l'intercepteur doit �tre "threadsafe".
+ Un intercepteur li� a <literal>SessionFactory</literal> est
d�fini avec l'objet <literal>Configuration</literal>
+ avant la construction de la <literal>SessionFactory</literal>.
Dans ce cas, les intercepteurs fournis seront
+ appliqu�s � toutes les sessions ouvertes pour cette
<literal>SessionFactory</literal>; ceci est vrai
+ � moins que la session ne soit ouverte en sp�cifiant l'intercepteur �
utiliser.
+ Les intercepteurs li�s � la <literal>SessionFactory</literal>
doivent �tre thread safe, faire attention
+ � ne pas stocker des �tats sp�cifiques de la session puisque plusieurs
sessions peuvent utiliser
+ l'intercepteur de mani�re concurrente.
</para>
<programlisting><![CDATA[new Configuration().setInterceptor( new
AuditInterceptor() );]]></programlisting>
</sect1>
- <sect1 id="objectstate-events" revision="3">
+ <sect1 id="objectstate-events" revision="4">
<title>Syst�me d'�v�nements</title>
<para>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml
===================================================================
---
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -6,7 +6,7 @@
Les classes persistantes sont les classes d'une application qui impl�mentent
les entit�s d'un probl�me m�tier (ex. Client et Commande dans une
application
de commerce �lectronique).
- Toutes les instances d'une classe persistante ne sont pas forc�ment
+ Toutes les instances d'une classe persistante ne sont pas forc�ment
dans l'�tat persistant - au lieu de cela, une instance peut �tre �ph�m�re
(NdT : transient) ou d�tach�e.
</para>
@@ -116,7 +116,7 @@
<para>
<literal>Cat</literal> a un constructeur sans argument.
Toutes les classes persistantes doivent avoir un
constructeur par d�faut (lequel peut ne pas �tre public) pour
qu'Hibernate puissent les instancier en utilisant
- <literal>Constructor.newInstance()</literal>. Nous
recommandons fortement d'avoir un constructeur par d�faut avec
+ <literal>Constructor.newInstance()</literal>. Nous
recommandons fortement d'avoir un constructeur par d�faut avec
au moins une visibilit� <emphasis>paquet</emphasis> pour la
g�n�ration du proxy � l'ex�cution dans Hibernate.
</para>
</sect2>
@@ -148,7 +148,7 @@
<itemizedlist spacing="compact">
<listitem>
<para>
- Les r�attachements transitifs pour les objets d�tach�s (mise �
jour en cascade ou fusion en cascade) -
+ Les r�attachements transitifs pour les objets d�tach�s (mise �
jour en cascade ou fusion en cascade) -
voir <xref linkend="objectstate-transitive"/>
</para>
</listitem>
@@ -270,13 +270,13 @@
en comparant la valeur de l'identifiant des deux objets. Si cette valeur
est identique, les deux
doivent repr�senter la m�me ligne de base de donn�es, ils sont donc �gaux (si
les deux sont
ajout�s � un <literal>Set</literal>, nous n'aurons qu'un
seul �l�ment dans le
- <literal>Set</literal>). Malheureusement, nous ne pouvons pas
utiliser cette approche avec
+ <literal>Set</literal>). Malheureusement, nous ne pouvons pas
utiliser cette approche avec
des identifiants g�n�r�s ! Hibernate n'assignera de
valeur d'identifiant qu'aux objets qui sont persistants, une instance
nouvellement cr��e n'aura
donc pas de valeur d'identifiant ! De plus, si une instance est non
sauvegard�e et actuellement dans un <literal>Set</literal>,
le sauvegarder assignera une valeur d'identifiant � l'objet. Si
<literal>equals()</literal> et <literal>hashCode()</literal>
- sont bas�es sur la valeur de l'identifiant, le code de hachage devrait
changer, rompant le contrat du <literal>Set</literal>.
- Regardez sur le site web d'Hibernate pour une discussion compl�te de ce
probl�me.
+ sont bas�es sur la valeur de l'identifiant, le code de hachage devrait
changer, rompant le contrat du <literal>Set</literal>.
+ Regardez sur le site web d'Hibernate pour une discussion compl�te de ce
probl�me.
Notez que ceci n'est pas un probl�me d'Hibernate, mais la s�mantique
normale de Java pour l'identit� d'un objet et l'�galit�.
</para>
@@ -314,7 +314,7 @@
}]]></programlisting>
<para>
- Notez qu'une clef m�tier ne doit pas �tre solide comme une clef primaire
de base de donn�es
+ Notez qu'une clef m�tier ne doit pas �tre solide comme une clef primaire
de base de donn�es
(voir <xref linkend="transactions-basics-identity"/>). Les
propri�t�s
immuables ou uniques sont g�n�ralement de bonnes candidates pour une clef
m�tier.
</para>
@@ -461,7 +461,7 @@
</sect1>
- <sect1 id="persistent-classes-tuplizers" revision="0">
+ <sect1 id="persistent-classes-tuplizers" revision="1">
<title>Tuplizers</title>
<para>
@@ -473,7 +473,7 @@
une telle structure de donn�es. Par exemple, pour le mode d'entit� POJO,
le tuplizer correspondant
sait comment cr�er le POJO � travers son constructeur et comment acc�der aux
propri�t�s du POJO
utilisant les accesseurs de la propri�t� d�finie. Il y a deux types de
Tuplizers haut niveau,
- repr�sent� par les interfaces
<literal>org.hibernate.tuple.EntityTuplizer</literal> et
+ repr�sent�s par les interfaces
<literal>org.hibernate.tuple.EntityTuplizer</literal> et
<literal>org.hibernate.tuple.ComponentTuplizer</literal>. Les
<literal>EntityTuplizer</literal>s
sont responsables de la gestion des contrats mentionn�s ci-dessus pour les
entit�s, alors que
les <literal>ComponentTuplizer</literal>s s'occupent des
composants.
@@ -509,7 +509,7 @@
public class CustomMapTuplizerImpl
- extends org.hibernate.tuple.DynamicMapEntityTuplizer {
+ extends org.hibernate.tuple.entity.DynamicMapEntityTuplizer {
// override the buildInstantiator() method to plug in our custom map...
protected final Instantiator buildInstantiator(
org.hibernate.mapping.PersistentClass mappingInfo) {
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -42,8 +42,8 @@
<programlisting><![CDATA[from eg.Cat]]></programlisting>
<para>
- qui retourne simplement toutes les instances de la classe
<literal>eg.Cat</literal>.
- Nous n'avons pas besoin d'habitude de qualifier le nom de la classe,
+ qui retourne simplement toutes les instances de la classe
<literal>eg.Cat</literal>.
+ Nous n'avons pas besoin d'habitude de qualifier le nom de la classe,
puisque <literal>auto-import</literal> est la valeur par d�faut.
Donc nous �crivons presque toujours :
</para>
@@ -80,7 +80,7 @@
</sect1>
- <sect1 id="queryhql-joins" revision="1">
+ <sect1 id="queryhql-joins" revision="2">
<title>Associations et jointures</title>
<para>
@@ -158,7 +158,7 @@
Une jointure "fetch�e" (rapport�e) n'a g�n�ralement pas besoin
de se voir assigner
un alias puisque les objets associ�s n'ont pas � �tre utilis�s dans les
autres clauses.
Notez aussi que les objets associ�s ne sont pas retourn�s directement dans le
r�sultat de
- la requ�te mais l'on peut y acc�der via l'objet parent. La seule
raison pour laquelle nous
+ la requ�te mais l'on peut y acc�der via l'objet parent. La seule
raison pour laquelle nous
pourrions avoir besoin d'un alias est si nous r�cup�rions r�cursivement
une collection suppl�mentaire :
</para>
@@ -171,17 +171,18 @@
Notez que la construction de <literal>fetch</literal> ne peut pas
�tre utilis�e dans les requ�tes appel�es par
<literal>scroll()</literal> ou
<literal>iterate()</literal>.
<literal>fetch</literal> ne devrait pas non plus �tre utilis�
avec <literal>setMaxResults()</literal> ou
- <literal>setFirstResult()</literal>.
<literal>fetch</literal> ne peut pas non plus �tre utilis� avec une
- condition <literal>with</literal> ad hoc. Il est
- possible de cr�er un produit cart�sien par jointure en r�cup�rant plus
d'une collection dans une requ�te,
- donc faites attention dans ce cas. R�cup�rer par jointure de multiples
collections donne aussi parfois
+ <literal>setFirstResult()</literal>, ces op�rations �tant bas�es
sur le nombre de r�sultats qui contient
+ g�n�ralement des doublons d�s que des collections sont charg�es.
+ <literal>fetch</literal> ne peut pas non plus �tre utilis� avec
une condition <literal>with</literal> ad hoc. Il est
+ possible de cr�er un produit cart�sien par jointure en r�cup�rant plus
d'une collection dans une requ�te,
+ donc faites attention dans ce cas. R�cup�rer par jointure de multiples
collections donne aussi parfois
des r�sultats inattendus pour des mappings de bag, donc soyez prudent lorsque
vous formulez vos requ�tes dans de tels cas.
Finalement, notez que <literal>full join fetch</literal> et
<literal>right join fetch</literal> ne sont pas utiles en g�n�ral.
</para>
<para>
- Si vous utilisez un chargement retard� pour les propri�t�s (avec une
instrumentation par bytecode), il est possible
- de forcer Hibernate � r�cup�rer les propri�t�s non encore charg�es
imm�diatement (dans la premi�re requ�te)
+ Si vous utilisez un chargement retard� pour les propri�t�s (avec une
instrumentation par bytecode), il est possible
+ de forcer Hibernate � r�cup�rer les propri�t�s non encore charg�es
imm�diatement (dans la premi�re requ�te)
en utilisant <literal>fetch all properties</literal>.
</para>
@@ -189,7 +190,7 @@
<programlisting><![CDATA[from Document doc fetch all properties where
lower(doc.name) like '%cats%']]></programlisting>
</sect1>
-
+
<sect1 id="queryhql-joins-forms">
<title>Formes de syntaxes pour les jointures</title>
@@ -198,14 +199,14 @@
</para>
<para>
- Les requ�tes pr�sentes dans la section pr�c�dente utilisent la forme
<literal>explicite</literal>
+ Les requ�tes pr�sentes dans la section pr�c�dente utilisent la forme
<literal>explicite</literal>
o� le mode cl� join est explicitement utilis� dans la clause from. C'est
la forme recommand�e.
</para>
<para>
La forme <literal>implicite</literal> n'utilise pas le mot
cl� join.
A la place, les associations sont "d�r�f�renc�es" en utilisant le
notation '.'. Ces
- jointures peuvent apparaitre dans toutes les clauses. Les jointures
<literal>implicites</literal>
+ jointures peuvent apparaitre dans toutes les clauses. Les jointures
<literal>implicites</literal>
r�sultent en des inner join dans le SQL g�n�r�.
</para>
@@ -398,7 +399,7 @@
<title>La clause where</title>
<para>
- La clause <literal>where</literal> vous permet de r�duire la
liste des instances retourn�es.
+ La clause <literal>where</literal> vous permet de r�duire la
liste des instances retourn�es.
Si aucun alias n'existe, vous pouvez vous r�f�rer aux propri�t�s par leur
nom :
</para>
@@ -614,7 +615,7 @@
<listitem>
<para>
Les fonctions HQL qui s'appliquent expressions repr�sentant des
collections : <literal>size(),
- minelement(), maxelement(), minindex(), maxindex()</literal>,
ainsi que les fonctions sp�ciales <literal>elements()</literal>
+ minelement(), maxelement(), minindex(), maxindex()</literal>,
ainsi que les fonctions sp�ciales <literal>elements()</literal>
et <literal>indices</literal> qui peuvent �tre
quantifi�es en utilisant <literal>some, all, exists, any, in</literal>.
</para>
</listitem>
@@ -822,11 +823,11 @@
</para>
</sect1>
- <sect1 id="queryhql-grouping">
+ <sect1 id="queryhql-grouping" revision="1">
<title>La clause group by</title>
<para>
- Si la requ�te retourne des valeurs aggr�g�es, celles ci peuvent �tre group�es
par propri�t� ou composant :
+ Si la requ�te retourne des valeurs aggr�g�es, celles-ci peuvent �tre group�es
par propri�t� d'une classe retourn�e ou par composant :
</para>
<programlisting><![CDATA[select cat.color, sum(cat.weight), count(cat)
@@ -847,20 +848,24 @@
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)]]></programlisting>
<para>
- Les fonctions SQL et les fonctions d'aggr�gations sont permises dans les
clauses <literal>having</literal>
- et <literal>order by</literal>, si elles sont support�es par la
base de donn�es (ce que ne fait pas MySQL par exemple).
+ Les fonctions SQL et les fonctions d'agr�gat sont permises dans les
clauses <literal>having</literal>
+ et <literal>order by</literal>, si elles sont prises en charge
par la base de donn�es (ce que ne fait pas MySQL par exemple).
</para>
<programlisting><![CDATA[select cat
from Cat cat
join cat.kittens kitten
-group by cat
+group by cat.id, cat.name, cat.other, cat.properties
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc]]></programlisting>
<para>
Notez que ni la clause <literal>group by</literal> ni la clause
<literal>order by</literal> ne peuvent contenir d'expressions
arithm�tiques.
+ Notez aussi qu'Hibernate ne d�veloppe pas une entit� faisant partie du
regroupement,
+ donc vous ne pouvez pas �crire <literal>group by cat</literal> si
toutes
+ les propri�t�s de <literal>cat</literal> sont non-agr�g�es. Vous
devez
+ lister toutes les propri�t�s non-agr�g�es explicitement.
</para>
</sect1>
@@ -912,7 +917,7 @@
)]]></programlisting>
<para>
- Notez que sur certaines bases de donn�es (mais par Oracle ou HSQL), vous
pouvez utiliser des constructeurs de tuples
+ Notez que sur certaines bases de donn�es (mais par Oracle ou HSQL), vous
pouvez utiliser des constructeurs de tuples
dans d'autres contextes, par exemple lors du requ�tage de composants ou
de types utilisateur composites :
</para>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -13,7 +13,7 @@
<para>Hibernate3 vous permet de sp�cifier du SQL �crit � la main (incluant les
proc�dures stock�es)
pour toutes les op�rations de cr�ation, mise � jour, suppression et
chargement.</para>
- <sect1 id="querysql-creating" revision="3">
+ <sect1 id="querysql-creating" revision="4">
<title>Utiliser une <literal>SQLQuery</literal></title>
<para>L'ex�cution des requ�tes en SQL natif est contr�l�e par
l'interface <literal>SQLQuery</literal>,
@@ -21,224 +21,369 @@
Dans des cas extr�mement simples, nous pouvons utiliser la forme suivante :
</para>
- <programlisting>List cats = sess.createSQLQuery("select * from
cats")
- .addEntity(Cat.class)
- .list();</programlisting>
+ <sect2>
+ <title>Requ�tes scalaires</title>
- <para>Cette requ�te a sp�cifi� :</para>
+ <para>La requ�te SQL la plus basique permet de r�cup�rer une liste de
(valeurs) scalaires.</para>
- <itemizedlist>
- <listitem>
- <para>la requ�te SQL</para>
- </listitem>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS").list();
+sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
+]]></programlisting>
- <listitem>
- <para>l'entit� retourn�e par la requ�te</para>
- </listitem>
- </itemizedlist>
+ <para>Ces deux requ�tes retourneront un tableau d'objets (Object[]) avec
+ les valeurs scalaires de chacune des colonnes de la table CATS.
+ Hibernate utilisera le ResultSetMetadata pour d�duire l'ordre et le type
+ des valeurs scalaires retourn�es.</para>
- <para>
- Ici, les noms de colonne des r�sultats sont suppos�s �tre les m�mes que les noms
de colonne sp�cifi�s dans le
- document de mapping. Cela peut �tre probl�matique pour des requ�tes SQL qui
joignent de multiple tables, puisque
- les m�mes noms de colonne peuvent appara�tre dans plus d'une table. La forme
suivante n'est pas vuln�rable � la
- duplication des noms de colonne :
- </para>
+ <para>Pour �viter l'overhead li� �
<literal>ResultSetMetadata</literal> ou simplement pour
+ �tre plus explicite dans ce qui est retourn�, vous pouvez utiliser
<literal>addScalar()</literal>.</para>
- <programlisting>List cats = sess.createSQLQuery("select {cat.*} from cats
cat")
- .addEntity("cat", Cat.class)
- .list();</programlisting>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS")
+ .addScalar("ID", Hibernate.LONG)
+ .addScalar("NAME", Hibernate.STRING)
+ .addScalar("BIRTHDATE", Hibernate.DATE)
+]]></programlisting>
- <para>Cette requ�te a sp�cifi� :</para>
+ <para>Cette requ�te sp�cifie:</para>
- <itemizedlist>
- <listitem>
- <para>la requ�te SQL, avec un param�tre fictif pour Hibernate pour injecter
les alias de colonne</para>
- </listitem>
+ <itemizedlist>
+ <listitem>
+ <para>la cha�ne de caract�re SQL</para>
+ </listitem>
- <listitem>
- <para>l'entit� retourn�e par la requ�te, et son alias de table
SQL</para>
- </listitem>
- </itemizedlist>
+ <listitem>
+ <para>les colonnes et les types retourn�s</para>
+ </listitem>
+ </itemizedlist>
- <para>
- La m�thode <literal>addEntity()</literal> associe l'alias de la
table SQL
- avec la classe de l'entit� retourn�e, et d�termine la forme de l'ensemble
des r�sultats de la requ�te.
- </para>
+ <para>Cela retournera toujours un tableau d'objets, mais sans utiliser le
+ <literal>ResultSetMetdata</literal>, mais r�cup�rera explicitement les
colonnes
+ ID, NAME and BIRTHDATE column �tant de respectivement de type Long, String et
Short,
+ depuis le resultset sous jacent. Cela signifie aussi que seules ces colonnes
seront
+ retourn�es m�me si la requ�te utilise <literal>*</literal>
+ et aurait pu retourner plus que les trois colonnes list�es.</para>
- <para>
- La m�thode <literal>addJoin()</literal> peut �tre utilis�e pour
charger des associations vers d'autres
- entit�s et collections.
- </para>
+ <para>Il est possible de ne pas d�finir l'information sur le type pour
toutes ou partie
+ des calaires.</para>
- <programlisting>List cats = sess.createSQLQuery(
- "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother =
cat.id"
- )
- .addEntity("cat", Cat.class)
- .addJoin("kitten", "cat.kittens")
- .list();</programlisting>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS")
+ .addScalar("ID", Hibernate.LONG)
+ .addScalar("NAME")
+ .addScalar("BIRTHDATE")
+]]></programlisting>
- <para>
- Une requ�te SQL native pourrait retourner une simple valeur scalaire ou une
combinaison de scalaires et d'entit�s.
- </para>
+ <para>Il s'agit essentiellement de la m�me requ�te que pr�c�demment,
mais
+ le <literal>ResultSetMetaData</literal> est utilis� pour d�cider des
types de NAME
+ et BIRTHDATE alors que le type de ID est explicitement sp�cifi�.</para>
- <programlisting>Double max = (Double) sess.createSQLQuery("select
max(cat.weight) as maxWeight from cats cat")
- .addScalar("maxWeight", Hibernate.DOUBLE);
- .uniqueResult();</programlisting>
+ <para>Les java.sql.Types retourn�s par le ResultSetMetaData sont mapp�s aux
type Hibernate
+ via le Dialect. Si un type sp�cifique n'est pas mapp� ou est mapp� � un type
non souhait�, il
+ est possible de personnaliser en invoquant
<literal>registerHibernateType</literal> dans
+ le Dialect.</para>
+ </sect2>
- <para>Vous pouvez alternativement d�crire les informations de mapping des
r�sultats dans vos fichiers hbm
- et les utiliser pour vos requ�tes.</para>
+ <sect2>
+ <title>Requ�tes d'entit�s</title>
- <programlisting>List cats = sess.createSQLQuery(
- "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother =
cat.id"
- )
- .setResultSetMapping("catAndKitten")
- .list();</programlisting>
- </sect1>
+ <para>Les requ�tes pr�c�dentes ne retournaient que des valeurs scalaires,
+ retournant basiquement que les valeurs brutes du resultset. Ce qui suit montre
+ comment r�cup�rer des entit�s depuis une requ�te native SQL, gr�ce �
+ <literal>addEntity()</literal>.</para>
- <sect1 id="querysql-aliasreferences">
- <title>Alias et r�f�rences de propri�t�</title>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM
CATS").addEntity(Cat.class);
+sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM
CATS").addEntity(Cat.class);
+]]></programlisting>
- <para>
- La notation <literal>{cat.*}</literal> utilis�e au-dessus est un
raccourci pour "toutes les propri�t�s".
- Alternativement, vous pouvez lister explicitement les colonnes, mais m�me ce cas
que nous laissons � Hibernate
- injecte des alias de colonne SQL pour chaque propri�t�. Le rempla�ant pour un
alias de colonne
- est juste le nom de la propri�t� qualifi� par l'alias de la table.
- Dans l'exemple suivant, nous r�cup�rons des
<literal>Cat</literal>s � partir d'une table diff�rente
- (<literal>cat_log</literal>) de celle d�clar�e dans les m�ta-donn�es
de mapping.
- Notez que nous pouvons m�me utiliser les alias de propri�t� dans la clause
"where" si nous le souhaitons.
- </para>
+ <para>Cette requ�te sp�cifie:</para>
- <para>
- La syntaxe <literal>{}</literal> <emphasis>n'est
pas</emphasis> requise pour le requ�tes nomm�es. Voir
- <xref linkend="querysql-namedqueries" />.
- </para>
+ <itemizedlist>
+ <listitem>
+ <para>La cha�ne de caract�re de requ�te SQL</para>
+ </listitem>
- <programlisting>String sql = "select cat.originalId as {cat.id}, " +
- "cat.mateid as {cat.mate}, cat.sex as {cat.sex}, " +
- "cat.weight*10 as {cat.weight}, cat.name as {cat.name} " +
- "from cat_log cat where {cat.mate} = :catId"
+ <listitem>
+ <para>L'entit� retourn�e par la requ�te</para>
+ </listitem>
+ </itemizedlist>
+ <para>Avec Cat mapp� comme classe avec les colonnes ID, NAME
+ et BIRTHDATE, les requ�tes pr�c�dentes retournent toutes deux une liste
+ o� chaque �l�ment est une entit� Cat.</para>
+
+ <para>Si l'entit� est mapp�e avec un
<literal>many-to-one</literal> vers
+ une autre entit�, il est requis de retourner aussi cette entit� en ex�cutant
+ la requ�te native, sinon une erreur "column not found" sp�cifique � la
base de
+ donn�es sera soulev�e. Les colonnes additionnelles seront automatiquement
+ retourn�es en utilisant la notation *, mais nous pr�f�rons �tre explicites
+ comme dans l'exemple suivant avec le <literal>many-to-one</literal>
vers
+ <literal>Dog</literal>:</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME,
BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class);
+]]></programlisting>
+
+ <para>Ceci permet � cat.getDog() de fonctionner normalement.</para>
+ </sect2>
+
+ <sect2>
+ <title>G�rer les associations et collections</title>
+
+ <para>Il est possible de charger agressivement
<literal>Dog</literal> pour
+ �viter le chargement de proxy qui signifie aller retour suppl�mentaire vers
+ la base de donn�es. Ceci est faisable via la m�thode
<literal>addJoin()</literal>,
+ qui vous permet de joindre une association ou collection.</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT c.ID, NAME,
BIRTHDATE, DOG_ID, D_ID, D_NAME FROM CATS c, DOGS d WHERE c.DOG_ID = d.D_ID")
+ .addEntity("cat", Cat.class)
+ .addJoin("cat.dog");
+]]></programlisting>
+
+ <para>Dans cet exemple, les <literal>Cat</literal> retourn�s
auront leur
+ propri�t� <literal>dog</literal> enti�rement initialis�es sans aucun
aller/retour
+ suppl�mentaire vers la base de donn�es. Notez que nous avons ajout� un alias
+ ("cat") pour �tre capable de sp�cifier la propri�t� cible de la
jointure.
+ Il est possible de faire la m�me jointure aggressive pour les collections, e.g. si
le
+ <literal>Cat</literal> a un one-to-many vers
<literal>Dog</literal>.</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME,
BIRTHDATE, D_ID, D_NAME, CAT_ID FROM CATS c, DOGS d WHERE c.ID = d.CAT_ID")
+ .addEntity("cat", Cat.class)
+ .addJoin("cat.dogs");
+]]></programlisting>
+
+ <p>Nous arrivons aux limites de ce qui est possible avec les requ�tes
natives
+ sans les modifier pour les rendre utilisables par Hibernate; les probl�mes
+ surviennent lorsque nous essayons de retourner des entit�s du m�me type ou
+ lorsque les alias/colonnes par d�faut ne sont plus suffisants..</p>
+ </sect2>
+
+ <sect2>
+ <title>Retour d'entit�s multiples</title>
+
+ <para>Jusqu'� pr�sent, les colonnes du resultset sont suppos�es �tre les
m�mes
+ que les colonnes sp�cifi�es dans les fichiers de mapping. Ceci peut
+ �tre probl�matique pour les requ�tes SQL qui effectuent de multiples
+ jointures vers diff�rentes tables, puisque les m�mes colonnes peuvent
+ appara�tre dans plus d'une table.</para>
+
+ <para>L'injection d'alias de colonne est requis pour la requ�te
suivante
+ (qui risque de ne pas fonctionner):</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT c.*, m.* FROM
CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class)
+]]></programlisting>
+
+ <para>Le but de cette requ�te est de retourner deux instances de Cat par
ligne,
+ un chat et sa m�re. Cela �chouera puisqu'il y a conflit de nom puisqu'ils
sont
+ mapp�s au m�me nom de colonne et que sur certaines base de donn�es, les alias
+ de colonnes retourn�s seront plut�t de la forme
+ "c.ID", "c.NAME", etc. qui ne sont pas �gaux aux colonnes
sp�cifi�es dans les
+ mappings ("ID" and "NAME").</para>
+
+ <para>La forme suivante n'est pas vuln�rable � la duplication des noms de
colonnes:</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT {cat.*},
{mother.*} FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class)
+]]></programlisting>
+
+ <para>Cette requ�te sp�cifie:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>la requ�te SQL, avec des r�ceptacles pour qu'Hibernate injecte
les alias de colonnes</para>
+ </listitem>
+
+ <listitem>
+ <para>les entit�s retourn�s par la requ�te</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Les notations {cat.*} et {mother.*} utilis�es sont un �quivalent �
'toutes les propri�t�s'.
+ Alternativement, vous pouvez lister les colonnes explicitement, mais m�me pour ce
cas, nous
+ laissons Hibernate injecter les alias de colonne pour chaque propri�t�.
+ Le r�ceptable pour un alias de colonne est simplement le nom de la propri�t�
+ qualifi� par l'alias de la table. Dans l'exemple suivant, nous r�cup�rons
+ les chats et leur m�re depuis une table diff�rentes (cat_log) de celle d�clar�e
+ dans les mappings. Notez que nous pouvons aussi utiliser les alias de propri�t�
+ dans la clause where si nous le voulons.</para>
+
+ <programlisting><![CDATA[String sql = "SELECT ID as {c.id}, NAME as
{c.name}, " +
+ "BIRTHDATE as {c.birthDate}, MOTHER_ID as {c.mother}, {mother.*} " +
+ "FROM CAT_LOG c, CAT_LOG m WHERE {c.mother} = c.ID";
+
List loggedCats = sess.createSQLQuery(sql)
- .addEntity("cat", Cat.class)
- .setLong("catId", catId)
- .list();</programlisting>
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class).list()
+]]></programlisting>
+ <sect3 id="querysql-aliasreferences" revision="2">
+ <title>R�f�rences d'alias et de propri�t�</title>
- <para>
- <emphasis>� noter :</emphasis> si vous listez chaque propri�t�
explicitement, vous devez inclure
- toutes les propri�t�s de la classe <emphasis>et ses
sous-classes</emphasis> !
- </para>
+ <para>Pour la plupart des cas pr�c�dents, l'injection d'alias est
requis,
+ mais pour les requ�tes relatives � des mappings plus complexes, comme
+ les propri�t�s composite, les discriminants d'h�ritage, les collections etc.,
il
+ y a des alias sp�cifiques � utiliser pour permettre � Hibernate l'injection
+ des bons alias.</para>
- <para>
- La table suivante montre les diff�rentes possibilit�s d'utilisation de
l'injection d'alias. � noter : les noms
- des alias dans le r�sultat sont des exemples, chaque alias aura un nom unique et
probablement diff�rent lors de l'utilisation.
- </para>
+ <para>Le tableau suivant montre les diverses possiblit�s d'utilisation
+ d'injection d'alias. Note: les noms d'alias dans le r�sultat sont
des
+ exemples, chaque alias aura un nom unique et probablement diff�rent
lorsqu'ils
+ seront utilis�s.</para>
- <table frame="topbot" id="aliasinjection-summary">
- <title>Noms d'injection d'alias</title>
+ <table frame="topbot" id="aliasinjection-summary">
+ <title>Nom d'injection d'alias</title>
- <tgroup cols="4">
- <colspec colwidth="1*" />
+ <tgroup cols="3">
+ <colspec colwidth="1*" />
- <colspec colwidth="1*" />
+ <colspec colwidth="1*" />
- <colspec colwidth="2.5*" />
+ <colspec colwidth="2.5*" />
- <thead>
- <row>
- <entry>Description</entry>
+ <thead>
+ <row>
+ <entry>Description</entry>
- <entry>Syntaxe</entry>
+ <entry>Syntaxe</entry>
- <entry>Exemple</entry>
- </row>
- </thead>
+ <entry>Exemple</entry>
+ </row>
+ </thead>
- <tbody>
- <row>
- <entry>Une simple propri�t�</entry>
+ <tbody>
+ <row>
+ <entry>Une propri�t� simple</entry>
-
<entry><literal>{[aliasname].[propertyname]}</literal></entry>
+
<entry><literal>{[aliasname].[propertyname]</literal></entry>
- <entry><literal>A_NAME as
{item.name}</literal></entry>
- </row>
+ <entry><literal>A_NAME as
{item.name}</literal></entry>
+ </row>
- <row>
- <entry>Une propri�t� compos�e</entry>
+ <row>
+ <entry>Une propri�t� composite</entry>
-
<entry><literal>{[aliasname].[componentname].[propertyname]}</literal></entry>
+
<entry><literal>{[aliasname].[componentname].[propertyname]}</literal></entry>
- <entry><literal>CURRENCY as {item.amount.currency}, VALUE as
- {item.amount.value}</literal></entry>
- </row>
+ <entry><literal>CURRENCY as {item.amount.currency}, VALUE as
+ {item.amount.value}</literal></entry>
+ </row>
- <row>
- <entry>Discriminant d'une entit�</entry>
+ <row>
+ <entry>Discriminateur d'une entit�</entry>
-
<entry><literal>{[aliasname].class}</literal></entry>
+
<entry><literal>{[aliasname].class}</literal></entry>
- <entry><literal>DISC as
{item.class}</literal></entry>
- </row>
+ <entry><literal>DISC as
{item.class}</literal></entry>
+ </row>
- <row>
- <entry>Toutes les propri�t�s d'une entit�</entry>
+ <row>
+ <entry>Toutes les propri�t�s d'une entit�</entry>
- <entry><literal>{[aliasname].*}</literal></entry>
+
<entry><literal>{[aliasname].*}</literal></entry>
- <entry><literal>{item.*}</literal></entry>
- </row>
+ <entry><literal>{item.*}</literal></entry>
+ </row>
- <row>
- <entry>Une clef de collection</entry>
+ <row>
+ <entry>La cl� d'une collection</entry>
- <entry><literal>{[aliasname].key}</literal></entry>
+
<entry><literal>{[aliasname].key}</literal></entry>
- <entry><literal>ORGID as
{coll.key}</literal></entry>
- </row>
+ <entry><literal>ORGID as
{coll.key}</literal></entry>
+ </row>
- <row>
- <entry>L'identifiant d'une collection</entry>
+ <row>
+ <entry>L'id d'une collection</entry>
- <entry><literal>{[aliasname].id}</literal></entry>
+
<entry><literal>{[aliasname].id}</literal></entry>
- <entry><literal>EMPID as {coll.id}</literal></entry>
- </row>
+ <entry><literal>EMPID as
{coll.id}</literal></entry>
+ </row>
- <row>
- <entry>L'�l�ment d'une collection</entry>
+ <row>
+ <entry>L'�l�ment d'une collection</entry>
-
<entry><literal>{[aliasname].element}</literal></entry>
+
<entry><literal>{[aliasname].element}</literal></entry>
- <entry><literal>XID as
{coll.element}</literal></entry>
+ <entry><literal>XID as
{coll.element}</literal></entry>
+ </row>
- <entry></entry>
- </row>
+ <row>
+ <entry>Propri�t� d'un �l�ment de collection</entry>
- <row>
- <entry>Propri�t� de l'�l�ment dans la collection</entry>
+
<entry><literal>{[aliasname].element.[propertyname]}</literal></entry>
-
<entry><literal>{[aliasname].element.[propertyname]}</literal></entry>
+ <entry><literal>NAME as
{coll.element.name}</literal></entry>
+ </row>
- <entry><literal>NAME as
{coll.element.name}</literal></entry>
- </row>
+ <row>
+ <entry>Toutes les propri�t�s d'un �l�ment de
collection</entry>
- <row>
- <entry>Toutes les propri�t�s de l'�l�ment dans la
collection</entry>
+
<entry><literal>{[aliasname].element.*}</literal></entry>
-
<entry><literal>{[aliasname].element.*}</literal></entry>
+
<entry><literal>{coll.element.*}</literal></entry>
+ </row>
- <entry><literal>{coll.element.*}</literal></entry>
- </row>
+ <row>
+ <entry>Toutes les propri�t�s d'une collection</entry>
- <row>
- <entry>Toutes les propri�t�s de la collection</entry>
+
<entry><literal>{[aliasname].*}</literal></entry>
- <entry><literal>{[aliasname].*}</literal></entry>
+ <entry><literal>{coll.*}</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Retour d'objet n'�tant pas des entit�s</title>
- <entry><literal>{coll.*}</literal></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
+ <para>Il est possible d'appliquer un ResultTransformer � une requ�te
native SQL. Ce qui permet, par exemple, de
+ retourner des entit�s non g�r�es.</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT NAME, BIRTHDATE
FROM CATS")
+
.setResultTransformer(Transformers.aliasToBean(CatDTO.class))]]></programlisting>
+
+ <para>Cette requ�te sp�cifie:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>une requ�te SQL</para>
+ </listitem>
+
+ <listitem>
+ <para>un transformateur de r�sultat</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ La requ�te pr�c�dente retournera une liste de
<literal>CatDTO</literal> qui auront �t� instanci�s
+ et dans lesquelles les valeurs de NAME et BIRTHNAME auront �t� inject�es dans les
propri�t�s ou champs
+ correspondants.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>G�rer l'h�ritage</title>
+
+ <para>Les requ�tes natives SQL pour les entit�s prenant part � un h�ritage
+ doivent inclure toutes les propri�t�s de la classe de base et de toutes
+ ses sous classes.</para>
+ </sect2>
+
+ <sect2>
+ <title>Param�tres</title>
+
+ <para>Les requ�tes natives SQL supportent aussi les param�tres
nomm�s:</para>
+
+ <programlisting><![CDATA[Query query = sess.createSQLQuery("SELECT *
FROM CATS WHERE NAME like ?").addEntity(Cat.class);
+List pusList = query.setString(0, "Pus%").list();
+
+query = sess.createSQLQuery("SELECT * FROM CATS WHERE NAME like
:name").addEntity(Cat.class);
+List pusList = query.setString("name", "Pus%").list();
]]></programlisting>
+ </sect2>
+
</sect1>
<sect1 id="querysql-namedqueries" revision="3">
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -223,7 +223,7 @@
objets.
</para>
- <sect2 id="objectstate-querying-executing">
+ <sect2 id="objectstate-querying-executing"
revision="1">
<title>Ex�cution de requ�tes</title>
<para>
@@ -251,8 +251,11 @@
Cat mother = (Cat) session.createQuery(
"select cat.mother from Cat as cat where cat = ?")
.setEntity(0, izi)
- .uniqueResult();]]></programlisting>
+ .uniqueResult();
+Query mothersWithKittens = (Cat) session.createQuery(
+ "select mother from Cat as mother left join fetch mother.kittens");
+Set uniqueMothers = new HashSet(mothersWithKittens.list());]]></programlisting>
<para>
Une requ�te est g�n�ralement ex�cut�e en invoquant
<literal>list()</literal>,
le r�sultat de la requ�te sera charg�e compl�tement dans une collection
en m�moire.
@@ -447,7 +450,7 @@
</sect3>
- <sect3 id="objectstate-querying-executing-named">
+ <sect3 id="objectstate-querying-executing-named"
revision="1">
<title>Externaliser des requ�tes nomm�es</title>
<para>
@@ -476,6 +479,15 @@
utilis�, vous pouvez aussi d�finir des requ�tes SQL nativez dans les
m�ta-donn�es, ou
migrer des requ�tes existantes vers Hibernate en les pla�ant dans les
fichiers de mapping.
</para>
+
+ <para>
+ Notez aussi que la d�claration d'une requ�te dans un �l�ment
<literal><hibernate-mapping></literal>
+ n�cessite un nom globalement unique pour la requ�te, alors que la
d�claration d'une requ�te
+ dans une �l�ment <literal><class></literal>
est rendue unique de mani�re automatique par
+ la mise en pr�fixe du nom enti�rement de la classe, par exemple
+ <literal>eg.Cat.ByNameAndMaximumWeight</literal>.
+ </para>
+
</sect3>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -482,7 +482,7 @@
</sect2>
- <sect2 id="transactions-demarcation-jta" revision="2">
+ <sect2 id="transactions-demarcation-jta" revision="3">
<title>Utilisation de JTA</title>
<para>Si votre couche de persistance s'ex�cute dans un serveur
d'application (par exemple, derri�re un EJB
@@ -514,19 +514,26 @@
sess.close();
}]]></programlisting>
- <para>Ou encore, avec la gestion automatique de contexte:</para>
-
+ <para>
+ Si vous souhaitez utiliser une <literal>Session</literal>
coupl�e � la transaction, c'est � dire, utiliser
+ la fonctionnalit� <literal>getCurrentSession()</literal> pour
la propagation facile du contexte,
+ vous devrez utiliser l'API JTA
<literal>UserTransaction</literal> directement:
+ </para>
<programlisting><![CDATA[// BMT idiom with getCurrentSession()
try {
- factory.getCurrentSession().beginTransaction();
+ UserTransaction tx = (UserTransaction)new InitialContext()
+ .lookup("java:comp/UserTransaction");
- // do some work
- ...
+ tx.begin();
- factory.getCurrentSession().getTransaction().commit();
+ // Do some work on Session bound to transaction
+ factory.getCurrentSession().load(...);
+ factory.getCurrentSession().persist(...);
+
+ tx.commit();
}
catch (RuntimeException e) {
- factory.getCurrentSession().getTransaction().rollback();
+ tx.rollback();
throw e; // or display error message
}]]></programlisting>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-10-02
18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-10-02
18:27:05 UTC (rev 10541)
@@ -18,7 +18,7 @@
les biblioth�ques tierces que nous nommons sont pour les JDK 1.4 et 5.0.
Vous
pourriez avoir besoin d'autres biblioth�ques pour le JDK 1.3.
</para>
-
+
<para>
Le code source de ce tutoriel est inclus dans la distribution dans le
r�pertoire
<literal>doc/reference/tutorial/</literal>.
@@ -26,7 +26,7 @@
</sect1>
- <sect1 id="tutorial-firstapp" revision="1">
+ <sect1 id="tutorial-firstapp" revision="2">
<title>Partie 1 - Premi�re application Hibernate</title>
<para>
@@ -339,7 +339,7 @@
</sect2>
- <sect2 id="tutorial-firstapp-configuration"
revision="1">
+ <sect2 id="tutorial-firstapp-configuration"
revision="2">
<title>Configuration d'Hibernate</title>
<para>
@@ -351,14 +351,14 @@
</para>
<para>
- Cr�ez un r�pertoire appel� <literal>data</literal> � la
racine du r�pertoire de d�veloppement -
+ Cr�ez un r�pertoire appel� <literal>data</literal> � la
racine du r�pertoire de d�veloppement -
c'est l� que HSQL DB stockera ses fichiers de donn�es. D�marrez
maintenant votre base de donn�es
- en ex�cutant <literal>java -classpath lib/hsqldb.jar
org.hsqldb.Server</literal> dans votre r�pertoire de travail.
+ en ex�cutant <literal>java -classpath ../lib/hsqldb.jar
org.hsqldb.Server</literal> dans votre r�pertoire de donn�es.
Vous observez qu'elle d�marre et ouvre une socket TCP/IP, c'est
l� que notre application
se connectera plus tard. Si vous souhaitez d�marrez � partir d'une
nouvelle base de donn�es
pour ce tutoriel (faites <literal>CTRL + C</literal> dans la
fen�tre the window), effacez
le r�pertoire <literal>data/</literal> et red�marrez HSQL DB
� nouveau.
-
+
</para>
<para>
@@ -533,7 +533,7 @@
<para>
Nous cr�erons une classe d'aide
<literal>HibernateUtil</literal> qui s'occupe du
- d�marrage et rend la gestion des <literal>Session</literal>s
plus facile.
+ d�marrage et rend la gestion des <literal>Session</literal>s
plus facile.
Regardons l'impl�mentation :
</para>
@@ -614,7 +614,7 @@
</sect2>
- <sect2 id="tutorial-firstapp-workingpersistence"
revision="4">
+ <sect2 id="tutorial-firstapp-workingpersistence"
revision="5">
<title>Charger et stocker des objets</title>
<para>
@@ -655,8 +655,10 @@
session.save(theEvent);
session.getTransaction().commit();
- }]]></programlisting>
+ }
+}]]></programlisting>
+
<para>
Nous cr�ons un nouvel objet <literal>Event</literal>, et le
remettons � Hibernate.
Hibernate s'occupe maintenant du SQL et ex�cute les
<literal>INSERT</literal>s
@@ -675,22 +677,39 @@
<para>
Que fait
<literal>sessionFactory.getCurrentSession()</literal> ? Premi�rement, vous
pouvez
l'invoquer autant de fois que vous le voulez et n'importe o� du
moment que vous avez votre
- <literal>SessionFactory</literal> (facile gr�ce �
<literal>HibernateUtil</literal>).
+ <literal>SessionFactory</literal> (facile gr�ce �
<literal>HibernateUtil</literal>).
La m�thode <literal>getCurrentSession()</literal> renvoie
toujours l'unit� de travail courante.
Souvenez vous que nous avons bascul� notre option de configuration au
m�canisme bas� sur le "thread"
- dans <literal>hibernate.cfg.xml</literal>. Par cons�quent, le
scope de l'unit� de travail
- courante est le thread java courant d'ex�cution. Ceci n'est pas
totalement vrai. Une
- <literal>Session</literal> commence lorsqu'elle est
vraiment utilis�e la premi�re fois,
- Lorsque nous appelons pour la premi�re fois
<literal>getCurrentSession()</literal>.
- Ensuite, elle est li�e, par Hibernate, au thread courant. Lorsque la
transaction s'ach�ve
- (commit ou rollback), Hibernate d�lie la
<literal>Session</literal> du thread et la ferme
- pour vous. Si vous invoquez
<literal>getCurrentSession()</literal> une autre fois, vous obtenez
+ dans <literal>hibernate.cfg.xml</literal>. Par cons�quent,
l'unit� de travail courante est li�e
+ au thread Java courant qui ex�cute notre application. Cependant, ce
n'est pas tout, vous devez
+ aussi consid�rer le scope, quand une unit� de travail commence et quand
elle finit.
+ </para>
+
+ <para>
+ Une <literal>Session</literal> commence lorsqu'elle est
vraiment utilis�e la premi�re fois,
+ lorsque nous appelons <literal>getCurrentSession()</literal>
pour la premi�re fois.
+ Ensuite, elle est attach�e par Hibernate au thread courant. Lorsque la
transaction s'ach�ve, par
+ commit ou par rollback, Hibernate d�tache automatiquement la
<literal>Session</literal> du thread et la ferme
+ pour vous. Si vous invoquez
<literal>getCurrentSession()</literal> une nouvelle fois, vous obtenez
une nouvelle <literal>Session</literal> et pouvez entamer une
nouvelle unit� de travail.
- Ce mod�le de programmation
"<emphasis>thread-bound</emphasis>" est le moyen le plus
- populaire d'utiliser Hibernate.
+ Ce mod�le de programmation
"<emphasis>thread-bound</emphasis>" est le moyen le plus
+ populaire d'utiliser Hibernate, puisqu'il permet un d�coupage
flexible de votre code (le code d�limitant
+ les transactions peut �tre s�par� du code acc�dant aux donn�es, nous
verrons cela plus loin dans ce tutorial).
</para>
-
+
<para>
+ A propos du scope de l'unit� de travail, la
<literal>Session</literal> Hibernate devrait-elle
+ �tre utilis�e pour ex�cuter une ou plusieurs op�rations en base de
donn�es ? L'exemple ci-dessus
+ utilise une <literal>Session</literal> pour une op�ration.
C'est une pure co�ncidence,
+ l'exemple est n'est seulement pas assez complexe pour montrer
d'autres approches. Le scope d'une
+ <literal>Session</literal> Hibernate est flexible mais vous
ne devriez jamais concevoir
+ votre application de mani�re � utiliser une nouvelle
<literal>Session</literal> Hibernate pour
+ <emphasis>chaque</emphasis> op�ration en base de donn�es.
Donc m�me si vous le voyez quelques fois
+ dans les exemples (tr�s simplistes) suivants, consid�rez
<emphasis>une session par operation</emphasis>
+ comme un anti-pattern. Une v�ritable application (web) est montr�e plus
loin dans ce tutorial.
+ </para>
+
+ <para>
Lisez <xref linkend="transactions"/> pour plus
d'informations sur la gestion des transactions et leur d�marcations.
Nous n'avons pas g�r� les erreurs et rollback sur l'exemple
pr�c�dent.
</para>
@@ -836,7 +855,7 @@
}]]></programlisting>
<para>
- Cr�ez un nouveau fichier de mapping appel�
<literal>Person.hbm.xml</literal>
+ Cr�ez un nouveau fichier de mapping appel�
<literal>Person.hbm.xml</literal>
(n'oubliez pas la r�f�rence � la DTD)
</para>
@@ -868,7 +887,7 @@
</sect2>
- <sect2 id="tutorial-associations-unidirset"
revision="2">
+ <sect2 id="tutorial-associations-unidirset"
revision="3">
<title>Une association unidirectionnelle bas�e sur Set</title>
<para>
@@ -906,7 +925,7 @@
Ce n'est pas n�cessaire d'un point de vue fonctionnel. Vous
pourrez toujours ex�cuter une requ�te
explicite pour r�cup�rer les participants d'un "event"
particulier. Ce choix de conception
vous est laiss�, mais ce qui reste certains est la cardinalit� de
l'association: "plusieurs"
- des deux c�t�s, nous appelons cela une association
<emphasis>many-to-many</emphasis>.
+ des deux c�t�s, nous appelons cela une association
<emphasis>many-to-many</emphasis>.
Par cons�quent nous utilisons un mapping Hibernate many-to-many:
</para>
@@ -920,7 +939,7 @@
<set name="events" table="PERSON_EVENT">
<key column="PERSON_ID"/>
- <many-to-many column="EVENT_ID" class="Event"/>
+ <many-to-many column="EVENT_ID" class="events.Event"/>
</set>
</class>]]></programlisting>
@@ -957,7 +976,7 @@
</sect2>
- <sect2 id="tutorial-associations-working"
revision="1">
+ <sect2 id="tutorial-associations-working"
revision="2">
<title>Travailler avec l'association</title>
<para>
@@ -991,14 +1010,14 @@
Hibernate surveille les changements et ex�cute le SQL correspondant. Le
processus de
synchronisation de l'�tat de la m�moire avec la base de donn�es,
g�n�ralement seulement � la fin
d'une unit� de travail, est appel�
<emphasis>flushing</emphasis>. Dans notre code, l'unit� de travail
- s'ach�ve par un commit (ou rollback) de la transaction avec la base
de donn�es - comme d�fini
+ s'ach�ve par un commit (ou rollback) de la transaction avec la base
de donn�es - comme d�fini
par notre option <literal>thread</literal> de configuration
pour la classe <literal>CurrentSessionContext</literal>.
</para>
<para>
Vous pourriez bien s�r charger une personne et un �v�nement dans
diff�rentes unit�s de travail. Ou
vous modifiez un objet � l'ext�rieur d'une
<literal>Session</literal>, s'il n'est pas dans un �tat
- persistant (s'il �tait persistant avant, nous appelons cet �tat
<emphasis>d�tach�</emphasis>).
+ persistant (s'il �tait persistant avant, nous appelons cet �tat
<emphasis>d�tach�</emphasis>).
Vous pouvez m�me modifier une collection lorsqu'elle est d�tach�e:
</para>
@@ -1038,6 +1057,14 @@
pour retourner cet identifiant).
</para>
+ <para>
+ Cela n'a pas grand int�r�t dans notre situation, mais c'est un
concept important qu'il vous faut concevoir
+ dans votre application. Pour le moment, compl�tez cet excercice en
ajoutant une nouvelle
+ action � la m�thode principale de
l'<literal>EventManager</literal> et invoquez la depuis la ligne de
commande.
+ Si vous avez besoin des identifiants d'un client et d'un
�v�nement - la m�thode <literal>save()</literal>
+ vous les retourne (vous devrez peut �tre modifier certaines m�thodes
pr�c�dentes pour retourner ces identifiants):
+ </para>
+
<programlisting><![CDATA[else if
(args[0].equals("addpersontoevent")) {
Long eventId = mgr.createAndStoreEvent("My Event", new Date());
Long personId = mgr.createAndStorePerson("Foo", "Bar");
@@ -1045,15 +1072,6 @@
System.out.println("Added person " + personId + " to event " +
eventId);]]></programlisting>
<para>
- Ce n'est pas tr�s utile dans notre situation actuelle, mais c'est
un concept important
- que vous pouvez mettre dans votre propre application.
- Pour le moment, compl�tez cet exercice en ajoutant une nouvelle action �
la m�thode
- principale des <literal>EventManager</literal>s et appelez la
� partir de la ligne de
- commande. Si vous avez besoin des identifiants d'une personne et
d'un �v�nement - la
- m�thode <literal>save()</literal> les retourne.
- </para>
-
- <para>
C'�tait un exemple d'une association entre deux classes de m�me
importance, deux entit�s.
Comme mentionn� plus t�t, il y a d'autres classes et d'autres
types dans un mod�le typique,
g�n�ralement "moins importants". Vous en avez d�j� vu certains,
comme un <literal>int</literal>
@@ -1143,7 +1161,7 @@
nous l'avons fait avant en liant des personnes et des �v�nements.
C'est le m�me code
en Java.
</para>
-
+
<programlisting><![CDATA[private void
addEmailToPerson(Long personId, String emailAddress) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
@@ -1285,7 +1303,7 @@
-->
</sect2>
</sect1>
-
+
<sect1 id="tutorial-webapp">
<title>Part 3 - L'application web EventManager</title>
@@ -1296,11 +1314,11 @@
la base de donn�es, et fournir une formulaire HTML pour saisir d'autres
�v�nements.
</para>
- <sect2 id="tutorial-webapp-servlet">
+ <sect2 id="tutorial-webapp-servlet" revision="2">
<title>Ecrire la servlet de base</title>
<para>
- Cr�ons une nouvelle classe dans notre r�pertoire source, dans le package
<literal>events</literal>:
+ Cr�ons une nouvelle classe dans notre r�pertoire source, dans le package
<literal>events</literal> :
</para>
<programlisting><![CDATA[package events;
@@ -1309,35 +1327,28 @@
public class EventManagerServlet extends HttpServlet {
- private final SimpleDateFormat dateFormatter =
- new SimpleDateFormat("dd.MM.yyyy");
-
// Servlet code
}]]></programlisting>
<para>
- Le <literal>dateFormatter</literal> est un outil que nous
utiliserons plus tard pour convertir les objets
- <literal>Date</literal> depuis et vers des chaines de
caract�res. Il est propice de n'avoir qu'un
- formatter comme membre de la servlet.
- </para>
-
- <para>
La servlet n'accepte que les requ�tes HTTP
<literal>GET</literal>, la m�thode � impl�menter est donc
- <literal>doGet()</literal>:
+ <literal>doGet()</literal> :
</para>
<programlisting><![CDATA[protected void doGet(HttpServletRequest
request,
HttpServletResponse response)
throws ServletException, IOException {
+ SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy");
+
try {
- // Begin unit of work
+ // D�but de l'unit� de travail
HibernateUtil.getSessionFactory()
.getCurrentSession().beginTransaction();
- // Process request and render page...
+ // Traitement de la requ�te et rendu de la page...
- // End unit of work
+ // Fin de l'unit� de travail
HibernateUtil.getSessionFactory()
.getCurrentSession().getTransaction().commit();
@@ -1350,15 +1361,22 @@
}]]></programlisting>
<para>
- La pattern que nous utilisons ici est appel�
<emphasis>session-per-request</emphasis>.
- Lorsqu'une requ�te touche la servlet, une nouvelle
<literal>Session</literal> hibernate est
- ouverte � l'invocationde
<literal>getCurrentSession()</literal> sur la
- <literal>SessionFactory</literal>. Ensuite, une transaction
avec la base de donn�es est d�marr�e—
- tous les acc�s � la base de donn�es interviennent au sein de la
transactiton, peu importe que les donn�es
+ Le pattern que nous utilisons ici est appel�
<emphasis>session-per-request</emphasis>.
+ Lorsqu'une requ�te appelle la servlet, une nouvelle
<literal>Session</literal> Hibernate est
+ ouverte � l'invocation de
<literal>getCurrentSession()</literal> sur la
+ <literal>SessionFactory</literal>. Ensuite, une transaction
avec la base de donn�es est d�marr�e —
+ tous les acc�s � la base de donn�es interviennent au sein de la
transaction, peu importe que les donn�es
soient lues ou �crites (nous n'utilisons pas le mode auto-commit dans
les applications).
</para>
<para>
+ <emphasis>N'utilisez pas</emphasis> une nouvelle
<literal>Session</literal> Hibernate pour
+ chaque op�ration en base de donn�es. Utilisez une
<literal>Session</literal> Hibernate qui
+ porte sur l'ensemble de la requ�te. Utlisez
<literal>getCurrentSession()</literal>,
+ ainsi elle est automatiquement attach�e au thread Java courant.
+ </para>
+
+ <para>
Ensuite, les actions possibles de la requ�tes sont ex�cut�es et la
r�ponse HTML
est rendue. Nous en parlerons plus tard.
</para>
@@ -1367,20 +1385,20 @@
Enfin, l'unit� de travail s'ach�ve lorsque l'ex�cution et le
rendu sont achev�s.
Si un probl�me survient lors de ces deux phases, une exception est
soulev�e et la
transaction avec la base de donn�es subit un rollback. Voila pour le
pattern
- <literal>session-per-request</literal>. Au lieu d'un code
de d�marcation de transaction
+ <literal>session-per-request</literal>. Au lieu d'avoir
un code de d�limitant les transactions
au sein de chaque servlet, vous pouvez �crire un filtre de servlet.
Voir le site Hibernate et le Wiki pour plus d'information sur ce
pattern, appel�
- <emphasis>Open Session in View</emphasis>— vous en aurez besoin
d�s que vous
- utiliserez des JSPs et non plus des servlets pour le rendu de vos vues.
+ <emphasis>Open Session in View</emphasis> — vous en
aurez besoin d�s que vous
+ utiliserez des JSPs et non plus des servlets pour le rendu de vos vues.
</para>
</sect2>
- <sect2 id="tutorial-webapp-processing">
+ <sect2 id="tutorial-webapp-processing" revision="1">
<title>Proc�der et rendre</title>
<para>
- Impl�mentons l'ex�cution de la requ�te et le rendu de la page.
+ Impl�mentons l'ex�cution de la requ�te et le rendu de la page.
</para>
<programlisting><![CDATA[// Write HTML header
@@ -1411,7 +1429,7 @@
out.close();]]></programlisting>
<para>
- Ce style de code avec un mix de Java et d'HTML ne serait pas scalable
+ Ce style de code avec un mix de Java et d'HTML ne serait pas
scalable
dans une application plus complexe—gardez � l'esprit que
nous ne faisons qu'illustrer
les concepts basiques d'Hibernate dans ce tutoriel. Ce code affiche
une en t�te et un pied de page
HTML. Dans cette page, sont affich�s un formulaire pour la saisie
d'�v�nements ainsi
@@ -1434,7 +1452,8 @@
requ�te:
</para>
- <programlisting><![CDATA[private void listEvents(PrintWriter out) {
+ <programlisting><![CDATA[private void listEvents(PrintWriter out,
SimpleDateFormat dateFormatter) {
+
List result = HibernateUtil.getSessionFactory()
.getCurrentSession().createCriteria(Event.class).list();
if (result.size() > 0) {
@@ -1535,13 +1554,13 @@
<para>
Pour construire et d�ployer, appelez <literal>ant
war</literal> dans votre projet et
copier le fichier <literal>hibernate-tutorial.war</literal>
dans le r�pertoire <literal>webapp</literal> de tomcat
- Si vous n'avez pas install� Tomcat, t�l�chargez le et suivez la
notice d'installation.
+ Si vous n'avez pas install� Tomcat, t�l�chargez le et suivez la
notice d'installation.
Vous n'avez pas � modifier la configuration Tomcat pour d�ployer
cette application.
</para>
<para>
Une fois l'application d�ploy�e et Tomcat lanc�, acc�dez �
l'application via
-
<literal>http://localhost:8080/hibernate-tutorial/eventmanager</literal>.
+
<literal>http://localhost:8080/hibernate-tutorial/eventmanager</literal>.
Assurez vous de consulter les traces tomcat pour observer
l'initialisation
d'Hibernate � la premi�re requ�te touchant votre servlet
(l'initialisation statique dans <literal>HibernateUtil</literal>
est invoqu�e) et pour v�rifier qu'aucune exception ne survienne.