Hibernate SVN: r10540 - trunk/Hibernate3/doc/reference/fr/modules
by hibernate-commits@lists.jboss.org
Author: AnthonyHib
Date: 2006-10-02 14:02:18 -0400 (Mon, 02 Oct 2006)
New Revision: 10540
Modified:
trunk/Hibernate3/doc/reference/fr/modules/batch.xml
trunk/Hibernate3/doc/reference/fr/modules/persistent_classes.xml
trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml
trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml
Log:
update for 3.2 doc compliance
Modified: trunk/Hibernate3/doc/reference/fr/modules/batch.xml
===================================================================
--- trunk/Hibernate3/doc/reference/fr/modules/batch.xml 2006-09-30 02:49:47 UTC (rev 10539)
+++ trunk/Hibernate3/doc/reference/fr/modules/batch.xml 2006-10-02 18:02:18 UTC (rev 10540)
@@ -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� :
@@ -218,8 +224,8 @@
session.close();]]></programlisting>
<para>
- 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
+ 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
Modified: trunk/Hibernate3/doc/reference/fr/modules/persistent_classes.xml
===================================================================
--- trunk/Hibernate3/doc/reference/fr/modules/persistent_classes.xml 2006-09-30 02:49:47 UTC (rev 10539)
+++ trunk/Hibernate3/doc/reference/fr/modules/persistent_classes.xml 2006-10-02 18:02:18 UTC (rev 10540)
@@ -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: trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml
===================================================================
--- trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-09-30 02:49:47 UTC (rev 10539)
+++ trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-10-02 18:02:18 UTC (rev 10540)
@@ -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>
@@ -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>
@@ -174,15 +174,15 @@
<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
+ 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>
@@ -190,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>
@@ -199,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>
@@ -399,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>
@@ -615,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>
@@ -823,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)
@@ -848,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>
@@ -913,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: trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml
===================================================================
--- trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-09-30 02:49:47 UTC (rev 10539)
+++ trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-10-02 18:02:18 UTC (rev 10540)
@@ -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>.
@@ -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 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>
@@ -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>
@@ -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>
@@ -1037,7 +1056,7 @@
(il se peut que vous ayez besoin de modifier quelques unes des m�thodes pr�c�dentes
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
@@ -1142,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();
@@ -1284,7 +1303,7 @@
-->
</sect2>
</sect1>
-
+
<sect1 id="tutorial-webapp">
<title>Part 3 - L'application web EventManager</title>
@@ -1295,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" revision="1">
+ <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;
@@ -1308,29 +1327,28 @@
public class EventManagerServlet extends HttpServlet {
- private final SimpleDateFormat dateFormatter =
- new SimpleDateFormat("dd.MM.yyyy");
-
// Servlet code
}]]></programlisting>
<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();
@@ -1343,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>
@@ -1360,11 +1385,11 @@
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>
@@ -1373,7 +1398,7 @@
<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
@@ -1404,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
@@ -1529,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.
18 years, 5 months