From: <hib...@li...> - 2006-08-03 17:16:49
|
Author: AnthonyHib Date: 2006-08-03 13:16:34 -0400 (Thu, 03 Aug 2006) New Revision: 10205 Modified: trunk/Hibernate3/doc/reference/fr/master.xml trunk/Hibernate3/doc/reference/fr/modules/basic_mapping.xml trunk/Hibernate3/doc/reference/fr/modules/batch.xml trunk/Hibernate3/doc/reference/fr/modules/configuration.xml trunk/Hibernate3/doc/reference/fr/modules/events.xml trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml trunk/Hibernate3/doc/reference/fr/modules/query_sql.xml trunk/Hibernate3/doc/reference/fr/modules/session_api.xml trunk/Hibernate3/doc/reference/fr/modules/transactions.xml trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml Log: update for 3.2 doc compliance Modified: trunk/Hibernate3/doc/reference/fr/master.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/master.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/master.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -33,7 +33,7 @@ <bookinfo> <title>HIBERNATE - Persistance relationnelle en Java standard</title> <subtitle>Documentation de rrence d'Hibernate</subtitle> - <releaseinfo>3.1final</releaseinfo> + <releaseinfo>3.2final</releaseinfo> </bookinfo> <toc/> Modified: trunk/Hibernate3/doc/reference/fr/modules/basic_mapping.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/basic_mapping.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/basic_mapping.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -86,7 +86,8 @@ qui agissent sur le sch de base de donn exportar l'outil de gration de sch. (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, vfiez votre daration de DTD par rapport au contenu de votre classpath. </para> + + <sect3 id="mapping-declaration-entity-resolution"> + <title>EntityResolver</title> + <para> + Comme citrdemment, Hibernate tentera de trouver les DTDs d'abord dans son classpath. Il + rsit aire cela en utilisant une implntation particuli 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 diffnts. + </para> + <itemizedlist> + <listitem> + <para> + un <literal>espace de nommage hibernate</literal> est reconnu dqu'un systemId commence par + <literal>http://hibernate.sourceforge.net/</literal>; alors ces entitsont rlues via le + classloader qui a charges classes Hibernate. + </para> + </listitem> + <listitem> + <para> + un <literal>espace de nommage utilisateur</literal> est reconnu dqu'un systemId utilise + un protocol URL <literal>classpath://</literal>. Le rlveur tentera de rudre ces entit+ 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> + Oteral>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 assignou des clefs compos !</emphasis> </para> </sect2> - <sect2 id="mapping-declaration-timestamp" revision="3" > + <sect2 id="mapping-declaration-timestamp" revision="4" > <title>timestamp (optionnel)</title> <para> L'ment optionnel <literal><timestamp></literal> indique que la table contient des donn @@ -1179,7 +1230,9 @@ </programlistingco> <para> Notez que <literal><timestamp></literal> est ivalent - <literal><version type="timestamp"></literal>. + <literal><version type="timestamp"></literal> et + <literal><timestamp source="db"></literal> ivaut <literal><version type="dbtimestamp"></literal>. </para> </sect2> <sect2 id="mapping-declaration-property" revision="4"> Modified: trunk/Hibernate3/doc/reference/fr/modules/batch.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/batch.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/batch.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -150,7 +150,7 @@ </sect1> - <sect1 id="batch-direct" revision="2"> + <sect1 id="batch-direct" revision="3"> <title>Options de style DML</title> <para> @@ -218,10 +218,34 @@ session.close();]]></programlisting> <para> - Pour exter un <literal>DELETE</literal> HQL, utilisez la m mode - <literal>Query.executeUpdate()</literal> : + Par dut, les statements HQL <literal>UPDATE</literal>, n'affectent pas la valeur des propris + <xref linkend="mapping-declaration-version">version</xref> ou + <xref linkend="mapping-declaration-timestamp">timestamp</xref> + pour les entitaffect; ceci est compatible avec la spec EJB3. Toutefois, + vous pouvez forcer Hibernate ettre our les valeurs des propris + <literal>version</literal> ou <literal>timestamp</literal> en utilisant le <literal>versioned update</literal>. + Pour se faire, ajoutez le mot clliteral>VERSIONED</literal> aprle mot clliteral>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(<literal>org.hibernate.usertype.UserVersionType</literal>) + ne sont pas supporten conjonction avec le statement <literal>update versioned</literal> statement. + </para> + + <para> + Pour exter un HQL <literal>DELETE</literal>, utilisez la m mode<literal>Query.executeUpdate()</literal>: + </para> + <programlisting><![CDATA[Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Modified: trunk/Hibernate3/doc/reference/fr/modules/configuration.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/configuration.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/configuration.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -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>Propris 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: trunk/Hibernate3/doc/reference/fr/modules/events.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/events.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/events.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -8,7 +8,7 @@ fonctionnalitgriques, et d'extensions de fonctionnalitd'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 e spfiuand une session est cr. + 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 dni + lorsqu'une session est ouverte via l'invocation des modes surcharg 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 e "threadsafe". + Un intercepteur li <literal>SessionFactory</literal> est dni avec l'objet <literal>Configuration</literal> + avant la construction de la <literal>SessionFactory</literal>. Dans ce cas, les intercepteurs fournis seront + appliquoutes les sessions ouvertes pour cette <literal>SessionFactory</literal>; ceci est vrai + oins que la session ne soit ouverte en spfiant l'intercepteur tiliser. + Les intercepteurs lia <literal>SessionFactory</literal> doivent e thread safe, faire attention + e pas stocker des ts spfiques de la session puisque plusieurs sessions peuvent utiliser + l'intercepteur de mani 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 d'nements</title> <para> Modified: trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -80,7 +80,7 @@ </sect1> - <sect1 id="queryhql-joins" revision="1"> + <sect1 id="queryhql-joins" revision="2"> <title>Associations et jointures</title> <para> @@ -171,8 +171,9 @@ Notez que la construction de <literal>fetch</literal> ne peut pas e utilisdans les requs appel par <literal>scroll()</literal> ou <literal>iterate()</literal>. <literal>fetch</literal> ne devrait pas non plus e utilisvec <literal>setMaxResults()</literal> ou - <literal>setFirstResult()</literal>. <literal>fetch</literal> ne peut pas non plus e utilisvec une - condition <literal>with</literal> ad hoc. Il est + <literal>setFirstResult()</literal>, ces options nt bas sur le nombre de rltats qui contient + gralement des doublons dque des collections sont charg. + <literal>fetch</literal> ne peut pas non plus e utilisvec une condition <literal>with</literal> ad hoc. Il est possible de cr un produit carten par jointure en rpnt plus d'une collection dans une requ, donc faites attention dans ce cas. Rpr par jointure de multiples collections donne aussi parfois des rltats inattendus pour des mappings de bag, donc soyez prudent lorsque vous formulez vos requs dans de tels cas. Modified: trunk/Hibernate3/doc/reference/fr/modules/query_sql.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/query_sql.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/query_sql.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -13,7 +13,7 @@ <para>Hibernate3 vous permet de spfier du SQL it a main (incluant les procres stock) pour toutes les options de crion, mise our, 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'extion des requs en SQL natif est contr par l'interface <literal>SQLQuery</literal>, @@ -21,224 +21,369 @@ Dans des cas extrment simples, nous pouvons utiliser la forme suivante : </para> - <programlisting>List cats = sess.createSQLQuery("select * from cats") - .addEntity(Cat.class) - .list();</programlisting> + <sect2> + <title>Requs scalaires</title> - <para>Cette requ a spfi</para> + <para>La requ SQL la plus basique permet de rpr une liste de (valeurs) scalaires.</para> - <itemizedlist> - <listitem> - <para>la requ SQL</para> - </listitem> + <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS").list(); +sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list(); +]]></programlisting> - <listitem> - <para>l'entitetournpar la requ</para> - </listitem> - </itemizedlist> + <para>Ces deux requs retourneront un tableau d'objets (Object[]) avec + les valeurs scalaires de chacune des colonnes de la table CATS. + Hibernate utilisera le ResultSetMetadata pour dire l'ordre et le type + des valeurs scalaires retourn.</para> - <para> - Ici, les noms de colonne des rltats sont suppose les ms que les noms de colonne spfidans le - document de mapping. Cela peut e probltique pour des requs SQL qui joignent de multiple tables, puisque - les ms noms de colonne peuvent apparae dans plus d'une table. La forme suivante n'est pas vulnble a - duplication des noms de colonne : - </para> + <para>Pour ter l'overhead li <literal>ResultSetMetadata</literal> ou simplement pour + e plus explicite dans ce qui est retournvous 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 a spfi</para> + <para>Cette requ spfie:</para> - <itemizedlist> - <listitem> - <para>la requ SQL, avec un parame fictif pour Hibernate pour injecter les alias de colonne</para> - </listitem> + <itemizedlist> + <listitem> + <para>la cha de caract SQL</para> + </listitem> - <listitem> - <para>l'entitetournpar la requ, et son alias de table SQL</para> - </listitem> - </itemizedlist> + <listitem> + <para>les colonnes et les types retourn/para> + </listitem> + </itemizedlist> - <para> - La mode <literal>addEntity()</literal> associe l'alias de la table SQL - avec la classe de l'entitetourn et drmine la forme de l'ensemble des rltats de la requ. - </para> + <para>Cela retournera toujours un tableau d'objets, mais sans utiliser le + <literal>ResultSetMetdata</literal>, mais rpra explicitement les colonnes + ID, NAME and BIRTHDATE column nt de respectivement de type Long, String et Short, + depuis le resultset sous jacent. Cela signifie aussi que seules ces colonnes seront + retourn m si la requ utilise <literal>*</literal> + et aurait pu retourner plus que les trois colonnes list.</para> - <para> - La mode <literal>addJoin()</literal> peut e utilispour charger des associations vers d'autres - entitet collections. - </para> + <para>Il est possible de ne pas dnir 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 SQL native pourrait retourner une simple valeur scalaire ou une combinaison de scalaires et d'entit - </para> + <para>Il s'agit essentiellement de la m requ que prdemment, mais + le <literal>ResultSetMetaData</literal> est utilisour dder des types de NAME + et BIRTHDATE alors que le type de ID est explicitement spfi/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 retournpar le ResultSetMetaData sont mappaux type Hibernate + via le Dialect. Si un type spfique n'est pas mappu est mapp un type non souhaitil + est possible de personnaliser en invoquant <literal>registerHibernateType</literal> dans + le Dialect.</para> + </sect2> - <para>Vous pouvez alternativement dire les informations de mapping des rltats dans vos fichiers hbm - et les utiliser pour vos requs.</para> + <sect2> + <title>Requs d'entit/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 requs prdentes ne retournaient que des valeurs scalaires, + retournant basiquement que les valeurs brutes du resultset. Ce qui suit montre + comment rpr des entitdepuis une requ native SQL, gr <literal>addEntity()</literal>.</para> - <sect1 id="querysql-aliasreferences"> - <title>Alias et rrences de propri</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> utilisau-dessus est un raccourci pour "toutes les propris". - Alternativement, vous pouvez lister explicitement les colonnes, mais m ce cas que nous laissons ibernate - injecte des alias de colonne SQL pour chaque propri. Le remplat pour un alias de colonne - est juste le nom de la propri qualifiar l'alias de la table. - Dans l'exemple suivant, nous rpns des <literal>Cat</literal>s artir d'une table diffnte - (<literal>cat_log</literal>) de celle dardans les m-donn de mapping. - Notez que nous pouvons m utiliser les alias de propri dans la clause "where" si nous le souhaitons. - </para> + <para>Cette requ spfie:</para> - <para> - La syntaxe <literal>{}</literal> <emphasis>n'est pas</emphasis> requise pour le requs nomm. Voir - <xref linkend="querysql-namedqueries" />. - </para> + <itemizedlist> + <listitem> + <para>La cha de caract de requ 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'entitetournpar la requ</para> + </listitem> + </itemizedlist> + <para>Avec Cat mappomme classe avec les colonnes ID, NAME + et BIRTHDATE, les requs prdentes retournent toutes deux une liste + oque ment est une entitat.</para> + + <para>Si l'entitst mappavec un <literal>many-to-one</literal> vers + une autre entitil est requis de retourner aussi cette entitn extant + la requ native, sinon une erreur "column not found" spfique a base de + donn sera soulev Les colonnes additionnelles seront automatiquement + retourn en utilisant la notation *, mais nous prrons e 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 at.getDog() de fonctionner normalement.</para> + </sect2> + + <sect2> + <title>Gr les associations et collections</title> + + <para>Il est possible de charger agressivement <literal>Dog</literal> pour + ter le chargement de proxy qui signifie aller retour supplntaire vers + la base de donn. Ceci est faisable via la mode <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> retournauront leur + propri <literal>dog</literal> entiment initialis sans aucun aller/retour + supplntaire vers la base de donn. Notez que nous avons ajoutn alias + ("cat") pour e capable de spfier la propri cible de la jointure. + Il est possible de faire la m 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 requs natives + sans les modifier pour les rendre utilisables par Hibernate; les probls + surviennent lorsque nous essayons de retourner des entitdu m type ou + lorsque les alias/colonnes par dut ne sont plus suffisants..</p> + </sect2> + + <sect2> + <title>Retour d'entitmultiples</title> + + <para>Jusqu'rnt, les colonnes du resultset sont suppos e les ms + que les colonnes spfi dans les fichiers de mapping. Ceci peut + e probltique pour les requs SQL qui effectuent de multiples + jointures vers diffntes tables, puisque les ms colonnes peuvent + apparae dans plus d'une table.</para> + + <para>L'injection d'alias de colonne est requis pour la requ 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 est de retourner deux instances de Cat par ligne, + un chat et sa m. Cela ouera puisqu'il y a conflit de nom puisqu'ils sont + mappau m nom de colonne et que sur certaines base de donn, les alias + de colonnes retournseront plute la forme + "c.ID", "c.NAME", etc. qui ne sont pas ux aux colonnes spfi dans les + mappings ("ID" and "NAME").</para> + + <para>La forme suivante n'est pas vulnble a 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 spfie:</para> + + <itemizedlist> + <listitem> + <para>la requ SQL, avec des rptacles pour qu'Hibernate injecte les alias de colonnes</para> + </listitem> + + <listitem> + <para>les entitretournpar la requ</para> + </listitem> + </itemizedlist> + + <para>Les notations {cat.*} et {mother.*} utilis sont un ivalent toutes les propris'. + Alternativement, vous pouvez lister les colonnes explicitement, mais m pour ce cas, nous + laissons Hibernate injecter les alias de colonne pour chaque propri. + Le rptable pour un alias de colonne est simplement le nom de la propri + qualifiar l'alias de la table. Dans l'exemple suivant, nous rpns + les chats et leur m depuis une table diffntes (cat_log) de celle dar+ dans les mappings. Notez que nous pouvons aussi utiliser les alias de propri + 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>Rrences d'alias et de propri</title> - <para> - <emphasis>noter :</emphasis> si vous listez chaque propri explicitement, vous devez inclure - toutes les propris de la classe <emphasis>et ses sous-classes</emphasis> ! - </para> + <para>Pour la plupart des cas prdents, l'injection d'alias est requis, + mais pour les requs relatives es mappings plus complexes, comme + les propris composite, les discriminants d'htage, les collections etc., il + y a des alias spfiques tiliser pour permettre ibernate l'injection + des bons alias.</para> - <para> - La table suivante montre les diffntes possibilitd'utilisation de l'injection d'alias. noter : les noms - des alias dans le rltat sont des exemples, chaque alias aura un nom unique et probablement diffnt lors de l'utilisation. - </para> + <para>Le tableau suivant montre les diverses possiblitd'utilisation + d'injection d'alias. Note: les noms d'alias dans le rltat sont des + exemples, chaque alias aura un nom unique et probablement diffnt lorsqu'ils + seront utilis</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</entry> + <tbody> + <row> + <entry>Une propri 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 compos/entry> + <row> + <entry>Une propri 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 entitentry> + <row> + <entry>Discriminateur d'une entitentry> - <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 propris d'une entitentry> + <row> + <entry>Toutes les propris d'une entitentry> - <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'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'ment d'une collection</entry> + <row> + <entry>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 d'un ment de collection</entry> - <row> - <entry>Propri de 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 propris d'un ment de collection</entry> - <row> - <entry>Toutes les propris de 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 propris d'une collection</entry> - <row> - <entry>Toutes les propris 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'nt pas des entit/title> - <entry><literal>{coll.*}</literal></entry> - </row> - </tbody> - </tgroup> - </table> + <para>Il est possible d'appliquer un ResultTransformer ne requ native SQL. Ce qui permet, par exemple, de + retourner des entitnon ges.</para> + + <programlisting><![CDATA[sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") + .setResultTransformer(Transformers.aliasToBean(CatDTO.class))]]></programlisting> + + <para>Cette requ spfie:</para> + + <itemizedlist> + <listitem> + <para>une requ SQL</para> + </listitem> + + <listitem> + <para>un transformateur de rltat</para> + </listitem> + </itemizedlist> + + <para> + La requ prdente retournera une liste de <literal>CatDTO</literal> qui auront instanci+ et dans lesquelles les valeurs de NAME et BIRTHNAME auront inject dans les propris ou champs + correspondants. + </para> + </sect2> + + <sect2> + <title>Gr l'htage</title> + + <para>Les requs natives SQL pour les entitprenant part n htage + doivent inclure toutes les propris de la classe de base et de toutes + ses sous classes.</para> + </sect2> + + <sect2> + <title>Parames</title> + + <para>Les requs natives SQL supportent aussi les parames nomm</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: trunk/Hibernate3/doc/reference/fr/modules/session_api.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/session_api.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/session_api.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -223,7 +223,7 @@ objets. </para> - <sect2 id="objectstate-querying-executing"> + <sect2 id="objectstate-querying-executing" revision="1"> <title>Extion de requs</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 est gralement exten invoquant <literal>list()</literal>, le rltat de la requ sera chargcomplment dans une collection en mire. @@ -447,7 +450,7 @@ </sect3> - <sect3 id="objectstate-querying-executing-named"> + <sect3 id="objectstate-querying-executing-named" revision="1"> <title>Externaliser des requs nomm</title> <para> @@ -476,6 +479,15 @@ utilisvous pouvez aussi dnir des requs SQL nativez dans les m-donn, ou migrer des requs existantes vers Hibernate en les plat dans les fichiers de mapping. </para> + + <para> + Notez aussi que la daration d'une requ dans un ment <literal><hibernate-mapping></literal> + nssite un nom globalement unique pour la requ, alors que la daration d'une requ + dans une ment <literal><class></literal> est rendue unique de mani automatique par + la mise en prxe du nom entiment de la classe, par exemple + <literal>eg.Cat.ByNameAndMaximumWeight</literal>. + </para> + </sect3> Modified: trunk/Hibernate3/doc/reference/fr/modules/transactions.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/transactions.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/transactions.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -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'exte dans un serveur d'application (par exemple, derri 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> coupla transaction, c'est ire, utiliser + la fonctionnalitliteral>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: trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml =================================================================== --- trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-08-03 17:07:28 UTC (rev 10204) +++ trunk/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-08-03 17:16:34 UTC (rev 10205) @@ -26,7 +26,7 @@ </sect1> - <sect1 id="tutorial-firstapp" revision="1"> + <sect1 id="tutorial-firstapp" revision="2"> <title>Partie 1 - Premi 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> @@ -353,7 +353,7 @@ <para> Cr un rrtoire appelliteral>data</literal> a racine du rrtoire de dloppement - c'est lue HSQL DB stockera ses fichiers de donn. Drrez maintenant votre base de donn - en extant <literal>java -classpath lib/hsqldb.jar org.hsqldb.Server</literal> dans votre rrtoire de travail. + en extant <literal>java -classpath ../lib/hsqldb.jar org.hsqldb.Server</literal> dans votre rrtoire de donn. Vous observez qu'elle drre et ouvre une socket TCP/IP, c'est lue notre application se connectera plus tard. Si vous souhaitez drrez artir d'une nouvelle base de donn pour ce tutoriel (faites <literal>CTRL + C</literal> dans la fene the window), effacez @@ -868,7 +868,7 @@ </sect2> - <sect2 id="tutorial-associations-unidirset" revision="2"> + <sect2 id="tutorial-associations-unidirset" revision="3"> <title>Une association unidirectionnelle bassur Set</title> <para> @@ -920,7 +920,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 +957,7 @@ </sect2> - <sect2 id="tutorial-associations-working" revision="1"> + <sect2 id="tutorial-associations-working" revision="2"> <title>Travailler avec l'association</title> <para> @@ -1037,6 +1037,14 @@ (il se peut que vous ayez besoin de modifier quelques unes des modes prdentes pour retourner cet identifiant). </para> + + <para> + Cela n'a pas grand intt dans notre situation, mais c'est un concept important qu'il vous faut concevoir + dans votre application. Pour le moment, complz cet excercice en ajoutant une nouvelle + action a mode 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 nement - la mode <literal>save()</literal> + vous les retourne (vous devrez peut e modifier certaines modes prdentes pour retourner ces identifiants): + </para> <programlisting><![CDATA[else if (args[0].equals("addpersontoevent")) { Long eventId = mgr.createAndStoreEvent("My Event", new Date()); @@ -1045,15 +1053,6 @@ System.out.println("Added person " + personId + " to event " + eventId);]]></programlisting> <para> - Ce n'est pas trutile dans notre situation actuelle, mais c'est un concept important - que vous pouvez mettre dans votre propre application. - Pour le moment, complz cet exercice en ajoutant une nouvelle action a mode - principale des <literal>EventManager</literal>s et appelez la artir de la ligne de - commande. Si vous avez besoin des identifiants d'une personne et d'un nement - la - mode <literal>save()</literal> les retourne. - </para> - - <para> C'it un exemple d'une association entre deux classes de m importance, deux entit Comme mentionnlus til y a d'autres classes et d'autres types dans un mod typique, gralement "moins importants". Vous en avez d vu certains, comme un <literal>int</literal> @@ -1296,7 +1295,7 @@ la base de donn, et fournir une formulaire HTML pour saisir d'autres nements. </para> - <sect2 id="tutorial-webapp-servlet"> + <sect2 id="tutorial-webapp-servlet" revision="1"> <title>Ecrire la servlet de base</title> <para> @@ -1316,12 +1315,6 @@ }]]></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 caracts. Il est propice de n'avoir qu'un - formatter comme membre de la servlet. - </para> - - <para> La servlet n'accepte que les requs HTTP <literal>GET</literal>, la mode mplnter est donc <literal>doGet()</literal>: </para> @@ -1376,7 +1369,7 @@ </sect2> - <sect2 id="tutorial-webapp-processing"> + <sect2 id="tutorial-webapp-processing" revision="1"> <title>Procr et rendre</title> <para> @@ -1434,7 +1427,8 @@ requ: </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) { |