Hibernate M.Youssfi Mapping Objet Relationnel avec Hibernate I- Introduction Tr

Hibernate M.Youssfi Mapping Objet Relationnel avec Hibernate I- Introduction Travailler dans les deux univers que sont l'orienté objet et la base de données relationnelle peut être lourd et consommateur en temps dans le monde de l'entreprise d'aujourd'hui. Hibernate est un outil de mapping objet/relationnel pour le monde Java. Le terme mapping objet/relationnel (ORM) décrit la technique consistant à faire le lien entre la représentation objet des données et sa représentation relationnelle basée sur un schéma SQL. Non seulement, Hibernate s'occupe du transfert des objets Java dans les tables de la base de données (et des types de données Java dans les types de données SQL), mais il permet de requêter les données et propose des moyens de les récupérer. Il peut donc réduire de manière significative le temps de développement qui aurait été autrement perdu dans une manipulation manuelle des données via SQL et JDBC. Le but d'Hibernate est de libérer le développeur de 95 pourcent des tâches de programmation liées à la persistance des données communes. Hibernate n'est probablement pas la meilleure solution pour les applications centrées sur les données qui n'utilisent que les procédures stockées pour implémenter la logique métier dans la base de données, il est le plus utile dans les modèles métier orientés objets dont la logique métier est implémentée dans la couche Java dite intermédiaire. Cependant, Hibernate vous aidera à supprimer ou à encapsuler le code SQL spécifique à votre base de données et vous aidera sur la tâche commune qu'est la transformation des données d'une représentation tabulaire à une représentation sous forme de graphe d'objets. Une première vue de l’architecture d’Hibernate, qui sera détaillée par la suite est la suivante : 1 • Hibernate permet d’assurer la persistance des objets de l’application dans un entrepôt de données. • Cet entrepôt de données est dans la majorité des cas une base de données relationnelle, mais il peut être un fichier XML (XML mapping). • Le mapping des objets est effectuée par Hibernate en se basant sur des fichiers de configuration en format texte ou souvent XML. Hibernate M.Youssfi II- Première application avec Hibernate 1- Préparer le projet Dans cette application nous allons créer une simple application sur console qui montre un cas de mapping objet relationnel avec hibernate. La première chose que nous faisons est de configurer notre répertoire de développement et de mettre toutes les bibliothèques dont nous avons besoin dedans. Téléchargez la distribution Hibernate à partir du site web d'Hibernate. Extrayez le paquet et placez toutes les bibliothèques requises trouvées dans /lib dans le répertoire /lib de votre nouveau répertoire de travail. Il devrait ressembler à ça : +lib antlr.jar cglib-full.jar asm.jar asm-attrs.jars commons-collections.jar commons-logging.jar ehcache.jar hibernate3.jar jta.jar dom4j.jar log4j.jar Ceci est l'ensemble minimum de bibliothèques requises (notez que nous avons aussi copié hibernate3.jar, l'archive principale) pour Hibernate. Lisez le fichier README.txt dans le répertoire lib/ de la distribution Hibernate pour plus d'informations à propos des biliothèques tierces requises et optionnelles. (En fait, log4j n'est pas requis mais préféré par beaucoup de développeurs.)  Créer un nouveau projet Tomcat  Copier les fichiers .jar nécessaires pour Hibernate dans le répertoire Lib  Comme, nous allons travailler avec MySQL comme SGBD, il faut également copier le connecteur MySQL ( Driver JDBC) dans le répertoire lib. Ce fichier est nommé mysql-connector-java-3.0.17-ga-bin.jar  Ajouter ces tous les fichiers .jar au classpath du projet. 2 Hibernate M.Youssfi Structure du projet : Supposant que nous avons besoin de gérer la participation des personnes à des réunions. Une personne participe à plusieurs réunions et chaque réunion concerne plusieurs personnes. 2- Première classe : Reunion.java package gest; import java.util.Date; public class Reunion { private Long idReunion; private Date dateReunion; private String titreReunion; public Reunion(){} public Date getDateReunion() { return dateReunion; } public void setDateReunion(Date dateReunion) { 3 Hibernate M.Youssfi this.dateReunion = dateReunion; } public Long getIdReunion() { return idReunion; } public void setIdReunion(Long idReunion) { this.idReunion = idReunion; } public String getTitreReunion() { return titreReunion; } public void setTitreReunion(String titreReunion) { this.titreReunion = titreReunion; } } Vous pouvez voir que cette classe utilise les conventions de nommage standard JavaBean pour les méthodes getter/setter des propriétés, ainsi qu'une visibilité privée pour les champs. Ceci est la conception recommandée - mais pas obligatoire. Hibernate peut aussi accéder aux champs directement, le bénéfice des méthodes d'accès est la robustesse pour la refonte de code. Le constructeur sans argument est requis pour instancier un objet de cette classe via reflexion. La propriété idReunion contient la valeur d'un identifiant unique pour une réunion particulière. Toutes les classes d'entités persistantes (ainsi que les classes dépendantes de moindre importance) auront besoin d'une telle propriété identifiante si nous voulons utiliser l'ensemble complet des fonctionnalités d'Hibernate. En fait, la plupart des applications (surtout les applications web) ont besoin de distinguer des objets par des identifiants, donc vous devriez considérer ça comme une fonctionnalité plutôt que comme une limitation. Cependant, nous ne manipulons généralement pas l'identité d'un objet. Vous pouvez voir qu'Hibernate peut accéder aux méthodes publiques, privées et protégées, ainsi qu'aux champs (publics, privés, protégés) directement. Le choix vous est laissé, et vous pouvez l'ajuster à la conception de votre application. Le constructeur sans argument est requis pour toutes les classes persistantes ; Hibernate doit créer des objets pour vous en utilisant la réflexion Java. Le constructeur peut être privé. 3- Le fichier de mapping de la classe Reunion Hibernate a besoin de savoir comment charger et stocker des objets d'une classe persistante. C'est là qu'intervient le fichier de mapping Hibernate. Le fichier de mapping indique à Hibernate à quelle table dans la base de données il doit accéder, et quelles colonnes de cette table il devra utiliser. La structure basique de ce fichier de mapping ressemble à ça : <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC 4 Hibernate M.Youssfi "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping- 3.0.dtd"> <hibernate-mapping> [...] </hibernate-mapping> Notez que la DTD Hibernate est très sophistiquée. Vous pouvez l'utiliser pour l'auto- complétement des éléments et des attributs de mapping XML dans votre éditeur ou votre IDE. Vous devriez aussi ouvrir le fichier DTD dans votre éditeur de texte - c'est le moyen le plus facile d'obtenir une vue d'ensemble de tous les éléments et attributs, et de voir les valeurs par défaut, ainsi que quelques commentaires. Notez qu'Hibernate ne chargera pas le fichier DTD à partir du web, mais regardera d'abord dans le classpath de l'application. Le fichier DTD est inclus dans hibernate3.jar ainsi que dans le répertoire src de la distribution Hibernate. Nous omettrons la déclaration de la DTD dans les exemples futurs pour raccourcir le code. Bien sûr il n'est pas optionnel. Entre les deux balises hibernate-mapping, incluez un élément class. Toutes les classes d'entités persistantes (encore une fois, il pourrait y avoir des classes dépendantes plus tard, qui ne sont pas des entités mère) ont besoin d'un mapping vers une table de la base de données SQL : <hibernate-mapping> <class name="gest.Reunion" table="REUNIONS"> </class> </hibernate-mapping> Plus loin, nous disons à Hibernate comment persister et charger un objet de la classe Reunion dans la table REUNIONS, chaque instance est représentée par une ligne dans cette table. Maintenant nous continuons avec le mapping de la propriété de l'identifiant unique vers la clef primaire de la table. De plus, comme nous ne voulons pas nous occuper de la gestion de cet identifiant, nous utilisons une stratégie de génération d'identifiant d'Hibernate pour la colonne de la clef primaire: <hibernate-mapping> <class name="gest.Reunion" table="REUNIONS"> <id name="idReunion" column="ID_REUNION"> <generator class="increment"/> </id> </class> </hibernate-mapping> 5 Hibernate M.Youssfi L'élément idReunion est la déclaration de la propriété de l'identifiant, name="idReunion" déclare le nom de la propriété Java - Hibernate utilisera les méthodes getter et setter pour accéder à la propriété. L'attribut column indique à Hibernate quelle colonne de la table REUNIONS nous utilisons pour cette clef primaire. L'élément generator imbriqué spécifie la stratégie de génération de l'identifiant, dans ce cas nous avons utilisé increment, laquelle est une méthode très simple utile surtout pour les tests (et didacticiels). Hibernate supporte aussi les identifiants générés par les bases de données, globalement uniques, ainsi que les identifiants assignés par l'application (ou n'importe quelle stratégie que vous avez écrite en extension). Finalement nous incluons des déclarations pour les propriétés persistantes de la classe dans le fichier de mapping. Par défaut, aucune propriété de la classe n'est considérée comme persistante : <hibernate-mapping> <class name="gest.Reunion" table="REUNIONS"> <id name="idReunion" column="ID_REUNION"> <generator class="increment"/> </id> <property name="dateReunion" type="timestamp" column="DATE_REUNION"/> <property name="titreReunion"/> </class> </hibernate-mapping> Comme avec l'élément idReunion, l'attribut name de l'élément property indique à Hibernate quels getters/setters utiliser. Pourquoi le mapping de la propriété dateReunion inclut l'attribut column, mais pas titreReunion ? Sans l'attribut column Hibernate utilise par défaut le nom de la propriété comme nom de colonne. Ca fonctionne bien pour titreReunion. Cependant, date est un mot clef réservé dans la plupart des bases de données, donc nous utilisons un nom différent pour le mapping. La prochaine chose intéressante est que le mapping de titreReunion manque aussi d'un attribut type. Les types que nous déclarons et utilisons dans les fichiers de mapping ne sont pas, comme uploads/Ingenierie_Lourd/ mapping-objet-relationnel-avec-hibernate.pdf

  • 17
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager