<?xml version="1.0"?>
<rss xmlns:php="http://php.net/xsl" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>JPA et l'héritage - Chicoree</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage</link><atom:link href="http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage?action=toFeed" rel="self" type="application/rss+xml"/><description><![CDATA[Une des différences fondamentales entre le modèle objet et le modèle relationnel est que ce dernier n'est pas capable de gérer la notion d'héritage. C'est un obstacle majeur lorsqu'il s'agit de faire persister un modèle objet complexe dans une base de données relationnelle. Heureusement, JPA – l'interface standard Java pour la persistance – est capable de venir à notre secours dans ce domaine également. C'est ce que nous allons voir dans cet article.
La bonne compréhension de cette article nécessite d'avoir déjà eu un premier contact avec JPA. Si ce n'est pas le cas, je vous engage à lire d'abord l'article Premier contact avec JPA et Hibernate.
]]></description><item><title>1 Le projet initial</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#Le_projet_initial</link><description><![CDATA[<p>Pour cet article, nous allons utiliser comme support un exemple simple et original. Histoire de marquer votre esprit. Donc voici: le département marketing d'un grand éditeur de romans a déterminé qu'il y avait un marché potentiel important pour des romans d'Heroic Fantasy écrit par ... un logiciel.
</p>]]></description></item><item><title>2 Entités polymorphiques</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#Entit.C3.A9s_polymorphiques</link><description><![CDATA[<p>Pour l'instant, nos personnages sont plutôt <i>passifs</i>. Mais pour avoir un roman à succès il est impératif que ceux-ci soient un tant soit peu plus <i>dynamiques</i>. Et dans un roman d'aventure, une des action favorite des personnages est d'attaquer leurs ennemis. Nous allons mettre en oeuvre cette action sous la forme d'une méthode à ajouter à l'entité <tt>Personnage</tt>:
</p>]]></description></item><item><title>2.1 Ajout d'un comportement</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#Ajout_d.27un_comportement</link><description><![CDATA[<p>Pour l'instant, nos personnages sont plutôt <i>passifs</i>. Mais pour avoir un roman à succès il est impératif que ceux-ci soient un tant soit peu plus <i>dynamiques</i>. Et dans un roman d'aventure, une des action favorite des personnages est d'attaquer leurs ennemis. Nous allons mettre en oeuvre cette action sous la forme d'une méthode à ajouter à l'entité <tt>Personnage</tt>:
</p>]]></description></item><item><title>2.2 Un peu de diversité</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#Un_peu_de_diversit.C3.A9</link><description><![CDATA[<p>Un roman où tous les personnages agissent de manière identique risque d'être bien vite lassant. Qui plus est, il serait souhaitable que les personnages agissent de façon un peu stéréotypée: les dragons crachent le feu, les nains brandissent des haches, etc. Tout ceci appelle à pleine voix l'utilisation de l'héritage et du polymorphisme. Or donc, voici deux nouvelles entités: le <tt>Dragon</tt> et le <tt>Nain</tt>. Mais ne mettons pas la charrue avant les boeufs et commençons tout d'abord avec la classe <tt>fr.chicoree.jpa.heroes.Dragon</tt>:
</p>]]></description></item><item><title>2.3 Tous pareils, mais tous différents</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#Tous_pareils.2C_mais_tous_diff.C3.A9rents</link><description><![CDATA[<p>Peut-être l'ignorez-vous, mais les nains sont très fiers de leurs ancêtres. Et c'est faire preuve de bonne manière que de se présenter en précisant un ou plusieurs de ses ascendants. Ici nous nous limiterons pour chaque nain au nom de son père. Ce qui nous donne l'<b>entité</b> suivante:
</p>]]></description></item><item><title>3 Stratégies alternatives</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#Strat.C3.A9gies_alternatives</link><description><![CDATA[<p>Nous avons vu que par défaut, Hibernate choisit pour stratégie une <b>table unique</b> pour stocker <b>tous les champs</b> de <b>toutes les classes</b> d'une arborescence d'entités.
Dans le vocabulaire de JPA, c'est la stratégie <tt>InheritanceType.SINGLE_TABLE</tt>. Vous pouvez l'indiquer explicitement dans le code de l'entité à la racine de l'arborescence avec l'annotation <tt>@Inheritance</tt>:
</p>]]></description></item><item><title>3.1 SINGLE_TABLE</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#SINGLE_TABLE</link><description><![CDATA[<p>Nous avons vu que par défaut, Hibernate choisit pour stratégie une <b>table unique</b> pour stocker <b>tous les champs</b> de <b>toutes les classes</b> d'une arborescence d'entités.
Dans le vocabulaire de JPA, c'est la stratégie <tt>InheritanceType.SINGLE_TABLE</tt>. Vous pouvez l'indiquer explicitement dans le code de l'entité à la racine de l'arborescence avec l'annotation <tt>@Inheritance</tt>:
</p>]]></description></item><item><title>3.2 JOINED</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#JOINED</link><description><![CDATA[<p>La stratégie que nous allons examiner maintenant est peut-être celle que vous auriez choisie si vous aviez mis en oeuvre la persistance de manière artisanale. Surtout si vous avez déjà une expérience des bases de données. L'idée est de stocker les données de chaque classe dans une table, et d'utiliser une jointure pour extraire l'ensemble des données d'un objet. La configuration de cette stratégie se fait à l'aide de l'annotation <tt>@Inheritance</tt> introduite à la section précédente:
</p>]]></description></item><item><title>3.3 TABLE_PER_CLASS</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#TABLE_PER_CLASS</link><description><![CDATA[<p>L'exécution ne change toujours pas:
</p>]]></description></item><item><title>4 Conclusion</title><link>http://www.chicoree.fr/w/JPA_et_l%27h%C3%A9ritage#Conclusion</link><description><![CDATA[<p>Comme vous le voyez, JPA nous facilite grandement la vie pour assurer la persistance d'objets appartenant à des arborescences de classes. En outre, cette solution est relativement souple puisqu'elle nous permet de choisir parmi différentes stratégies. Néanmoins, il n'y a pas une stratégie meilleure que les autres dans <i>tous</i> les cas. Le choix de l'une ou de l'autre dépendra de l'arborescence de vos classes, de la distribution des champs dans ces classes, et de l'utilisation que vous ferez de vos données.
</p>]]></description></item></channel></rss>
