Accéder au contenu principal

Génération de classes Hibernate sous Eclipse

Dans la plupart de mes projets nous avons utilisé Hibernate. Hibernate offre une couche d'abstraction entre le monde Objet en Java et les bases de données relationnelles. Il permet de faire ainsi le lien entre des classes Java POJO (classes standard Plain Old Java Object) et du SQL. Il utilise quelques fichiers XML pour la configuration et des annotations Java pour faire la correspondance avec les tables SQL. Je vais décrire dans ce billet à travers un exemple simple comment utiliser le plugin Eclipse pour générer automatiquement les classes Java à partir d'une base de données existante.

J'ai utilisé :

Tout d'abord, installez le plugin Hibernate dans Eclipse (Help->Install New Software).


Création de la base de données

Sous Java DB, démarrez la base de donnée en mode serveur "startNetworkServer.bat".

Lancez l'utilitaire "ij.bat" fourni pour créer une base de données.
connect 'jdbc:derby://localhost:1527/test;user=linus;password=ChangeMe;create=true';
Un répertoire nommé test sera créé et contiendra les données de la base.

Vous pourrez vous reconnecter ultérieurement à la base à l'aide de la commande suivante.

 connect 'jdbc:derby://localhost:1527/test;user=linus;password=ChangeMe';  

Toujours sous "ij", créez une base de données "dbnote".

 create table DBNote (  
   id int generated by default as identity not null,  
   SID varchar(50),  
   date date,  
   title varchar(100),  
   marked int,  
   content varchar(4096));  

Executez la commande "commit;" pour être certain que les données sont bien écrites en base et vérifier que la table a bien été créée avec la commande "describe dbnote;".

 ij> commit;  
 ij> describe dbnote;  
 COLUMN_NAME     |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&  
 ------------------------------------------------------------------------------  
 ID         |INTEGER |0  |10 |10  |GENERATED&|NULL   |NO  
 SID         |VARCHAR |NULL|NULL|50  |NULL   |100    |YES  
 DATE        |DATE   |0  |10 |10  |NULL   |NULL   |YES  
 TITLE        |VARCHAR |NULL|NULL|100  |NULL   |200    |YES  
 MARKED       |INTEGER |0  |10 |10  |NULL   |NULL   |YES  
 CONTENT       |VARCHAR |NULL|NULL|4096 |NULL   |8192   |YES  
 6 lignes sΘlectionnΘes  
 ij>  

Création du projet sous Eclipse

Créez un nouveau projet TestHibernate.
Ajoutez un répertoire "lib" qui contiendra les librairies Java nécessaires à Hibernate ainsi que la librairie pour l'accès à la base de données.
Les librairies suivantes sont obligatoires pour hibernate :
  • hibernate3.jar
  • antlr-2.7.6.jar 
  • commons-collections-3.1.jar
  • dom4j-1.6.1.jar
  • javassist-3.1.2.0.GA.jar
  • jta-1.1.jar
  • slf4j.api-1.6.1.jar
La librairie hibernate-jpa-2.0-api-1.0.1.Final.jar est nécessaire qui si vous souhaitez utiliser de annotations. Vous avez le choix entre les utiliser ou utiliser le fichier "dbnote.hbm.xml" qui contient les informations de mapping. Utilisez de préférence les annotations, ce qui fera un fichier de moins à gérer.

La librairie cp30-0.9.1.jar est utilisée pour gérer un pool de connexions à la base de données. Les ouvertures de connexions sont assez couteuses en temps. Il est préférable de créer quelques connexions dès le démarrage de l'application et d'en garder quelques unes actives. Cela n'empêche pas les risques de déconnexion, mais cela vous assurera que vous aurez une connexion valide lorsque vous exécuterez votre requête.


1. Première étape, création du fichier de configuration qui permettra de se connecter à la base de données et d'indiquer le "dialect" à utiliser pour la conversion entre le Java et le SQL propriétaire de la base de données. Si vous souhaitez utiliser des annotations, sélectionnez "Annotation JDK 1.5+". Donnez un nom à la configuration et cliquez sur New pour créer la connexion à la base.


Pour Java DB, sélectionnez Derby.

Entrez les paramètres de connexion à la base :
  • database : test (c'est la base qui a été créée dans la section précédente)
  • host : localhost (car la base se trouve sur le même PC)
  • port : 1527 (c'est le port par défaut de Derby, mais il peut être modifié)
  • username : linus (indiqué à la création de la base)
  • password : ChangeMe (indiqué à la création de la base. Attention, si vous cochez "Save Password", le mot de passe sera sauvegardé en clair dans le fichier de configuration. Il faut donc éviter de le faire si votre machine est exposée sur Internet).
 Faites un test de connexion pour vous assurer que la configuration est correcte et vérifiez dans le "Summary" que les informations sont correctes.


Cliquez sur "Finish". Dans l'onglet "Options", sélectionnez le "Dialect" Derby.


Si vous avez oublié des options ou si vous souhaitez modifier le nom d'une configuration, vous pouvez ré-éditer la configuration à tout moment en allant dans la perspective "Hibernate". Vous y trouverez également la base configurée ainsi que les tables accessibles.

La configuration est stockée dans un fichier hibernate.cfg.xml qui peut également être édité à la main.

 <?xml version="1.0" encoding="UTF-8"?>  
 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
                      "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
 <hibernate-configuration>  
  <session-factory name="">  
  <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>  
  <property name="hibernate.connection.password">ChangeMe</property>  
  <property name="hibernate.connection.url">jdbc:derby://localhost:1527/test;create=true</property>  
  <property name="hibernate.connection.username">linus</property>  
  <property name="hibernate.default_schema">LINUS</property>  
  <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property>  
  <mapping class="com.hibernate.test.Dbnote"/>  
  </session-factory>  
 </hibernate-configuration>  

2. Seconde étape, définition du fichier de Reverse Engineering qui permettra de générer les classes Java. Sélectionnez le menu "Run", puis "Hibernate Code Generation" pour créer une nouvelle configuration.
Dans l'onglet "Main", indiquez dans quel répertoire  vous souhaitez sauvegarder la configuration du Reverse Engineering.

Indiquez dans quel répertoire vous souhaitez stocker le fichier. Cela peut être à la racine du projet ou dans le répertoire source. Cela n'a pas beaucoup d'importance. Ce fichier n'est pas utilisé pour l'exécution.

Sélectionnez les classes que vous souhaitez utiliser et excluez les classes ou les bases de données que vous ne souhaitez pas utiliser. Sur de très grosses bases de plusieurs centaines ou milliers de tables, cette étape est nécessaire car elle permet d'améliorer de manière assez significative le temps d'ouverture de la base.

Dans l'onglet "Exporters", sélectionnez "Use Java 5 syntax" et "Generate EJB3 annotations". C'est cette dernière option qui générera les annotations dans le code Java. Vous pouvez ensuite générer le fichier "Hibernate XML mappings", mais ce dernier n'est pas nécessaire si vous utilisez les annotations. Vous pouvez également choisir de générer le fichier XML et d'avoir une classe Java standard sans annotation. Dans la mesure du possible, essayez d'utiliser pleinement les possibilités offertes par l'outil de Reverse Engineering, ce qui vous permettra de régénérer les classes automatiquement et essayez de ne pas modifier les classes générer. J'ai choisi de générer les classes directement dans le répertoire "src", mais vous pouvez utiliser un répertoire séparé pour éviter d'écraser vos éventuelles modifications manuelles.


Dans l'onglet "Refresh", sélectionnez "Refresh Resources upon completion" et "The project containing  the selected resource" pour éviter que tous les projets du Workspace ne soient recompilés.
Cliquez sur close. On rajoutera des propriétés supplémentaires sur le fichier de Reverse Engineering.

3. Mettez à jour le projet afin de rajouter le support pour Hibernate. Cliquez sur "Details" pour sélectionner le fichier de configuration à sélectionner.


Selectionnez "Get values from connection" pour remplir automatiquement tous les champs.


4. Editez le fichier "hibernate.reveng.xml" depuis la perspective "Java".
Ajoutez la table DBNOTE en cliquant sur le bouton "Add". Une fois toutes les colonnes de la table ajoutées, cliquez sur "Add primary key" pour indiquer la clé primaire. Selectionnez "Add generator" et "Add column".
Pour la valeur de "Id Generator details", saissez "native", ce qui permettra d'utiliser l'auto-incrémentation native de Derby. Pour Oracle, il faudra indiquer la séquence à utiliser avec "Add parameter".
Pour la valeur de "Column details", saisisser "ID" qui est la clé primaire.
Supprimez la colonne "ID" de la liste des colonnes affichées.

Vous pouvez également éditer le fichier XML directement. C'est plus rapide et plus simple pour rajouter la Primary Key.

Dans le menu "Run", "Hibernate code generation", exécutez la configuration de reverse Engineering. Cela génèrera une classe Java avec des annotations.

 package com.hibernate.test;  
   
 // Generated 19 sept. 2013 11:17:43 by Hibernate Tools 4.0.0  
   
 import java.util.Date;  
 import javax.persistence.Column;  
 import javax.persistence.Entity;  
 import javax.persistence.GeneratedValue;  
 import javax.persistence.Id;  
 import javax.persistence.Table;  
 import javax.persistence.Temporal;  
 import javax.persistence.TemporalType;  
   
 /**  
  * Dbnote generated by hbm2java  
  */  
 @Entity  
 @Table(name = "DBNOTE")  
 public class Dbnote implements java.io.Serializable {  
   
      private Integer id;  
      private String sid;  
      private Date date;  
      private String title;  
      private Integer marked;  
      private String content;  
   
      public Dbnote() {  
      }  
   
      public Dbnote(String sid, Date date, String title, Integer marked,  
                String content) {  
           this.sid = sid;  
           this.date = date;  
           this.title = title;  
           this.marked = marked;  
           this.content = content;  
      }  
   
      @Id  
      @GeneratedValue  
      @Column(name = "ID", nullable = false)  
      public Integer getId() {  
           return this.id;  
      }  
   
      public void setId(Integer id) {  
           this.id = id;  
      }  
   
      @Column(name = "SID", length = 50)  
      public String getSid() {  
           return this.sid;  
      }  
   
      public void setSid(String sid) {  
           this.sid = sid;  
      }  
   
      @Temporal(TemporalType.DATE)  
      @Column(name = "DATE", length = 10)  
      public Date getDate() {  
           return this.date;  
      }  
   
      public void setDate(Date date) {  
           this.date = date;  
      }  
   
      @Column(name = "TITLE", length = 100)  
      public String getTitle() {  
           return this.title;  
      }  
   
      public void setTitle(String title) {  
           this.title = title;  
      }  
   
      @Column(name = "MARKED")  
      public Integer getMarked() {  
           return this.marked;  
      }  
   
      public void setMarked(Integer marked) {  
           this.marked = marked;  
      }  
   
      @Column(name = "CONTENT", length = 4096)  
      public String getContent() {  
           return this.content;  
      }  
   
      public void setContent(String content) {  
           this.content = content;  
      }  
   
 }  
   

5. Test de la classe Hibernate générée.
Créez une classe dans le projet pour tester la classe générée. Nous allons tester l'insertion d'une donnée dans la base, ainsi que la lecture de la donnée en indiquant sont ID. Faites d'abord une requête en base afin de vous assurer que l'ID existe bien.
Les classes à mapper sont également décrites dans le fichier "hibernate.cfg.xml". Vous pouvez en rajouter en éditant ce fichier.

Le fichier de configuration contenant les informations de connexions à la base est lu avec la commande "config.configure(configFile)". Par défaut le fichier de configuration doit être dans le répertoire "bin", mais vous pouvez le mettre à un autre endroit.
La commande "config.buildSessionFactory" permet de retrouver toutes les classes, y compris celles qui contiennent des annotations. Vous pouvez également choisir d'utiliser les fichiers "hbm.xml" si vous le souhaitez.
   
 import org.hibernate.*;  
 import org.hibernate.cfg.Configuration;  
   
 import com.hibernate.test.Dbnote;  
   
 import java.io.File;  
 import java.util.Date;  
   
 public class TestHibernate {  
    
  public static void main(String args[]) throws Exception {  
   Configuration config = new Configuration();  
   File configFile = new File("hibernate.cfg.xml");  
   config.configure(configFile);  
         
   SessionFactory sessionFactory = config.buildSessionFactory();  
   Session session = sessionFactory.openSession();   
   
   Transaction tx = null;   
   try {   
    tx = session.beginTransaction();  
    // Insert one note in database  
    Dbnote note = new Dbnote("123", new Date(), "TEST", 0, "");     
    session.save(note);  
    session.flush();  
    tx.commit();  
      
    // Reload the note with ID 1  
    Dbnote instance = (Dbnote)session.load(Dbnote.class, 1);  
    System.out.println(instance.getTitle());  
   } catch (Exception e) {  
    if (tx != null) {  
     tx.rollback();  
    }  
    throw e;  
   } finally {   
    session.close();   
   }   
     
   sessionFactory.close();  
   System.exit(0);  
  }   
 }  

Le projet complet peut être téléchargé ici.

Le nombre d'étapes est relativement important, mais la plupart d'entre elles ne sont exécutées qu'une seule fois.
N'hésitez pas à laisser a poser des questions si vous rencontrez des problèmes.

Commentaires

Posts les plus consultés de ce blog

Utilisez votre tablette Android comme second écran pour Linux (Raspberry Pi, MK908II)

Les tablettes Android atteignent désormais des prix qui défient toute concurrence. On trouve désormais des modèles à 39 € TTC en super marché, soit à peine plus cher que le Raspberry PI, mais avec un écran. Ces modèles souvent mono-core 1Ghz ou 1,4 Ghz avec 512 ou 1Go de mémoire ne sont très probablement pas utilisables pour une utilisation régulière sur Internet et ne sont en aucun point comparables à leur équivalent de marque (Samsung, Sony, LG, HTC, Lenovo, etc). Plusieurs tutoriels indiquent comment connecter utiliser une tablette Android comme second écran ( http://www.linux-magazine.com/Online/Blogs/Productivity-Sauce/Use-an-Android-Device-as-Screen-and-Input-for-Raspberry-Pi ). Ces méthodes utilisent généralement l'USB Tethering qui n'est malheureusement disponible que sur les téléphones ou tablettes avec un accès mobile (3G ou 4G) inclus. Dans ce billet, je vais vous montrer comment se connecter à une tablette en utilisant le mode Debug adb (Android Debug Bridge

Supprimer les partitions Raspberry sur une carte SD sous Windows avec Diskpart

Si vous souhaitez récupérer une ancienne carte SD utilisée pour démarrer un Raspberry pour un autre usage (appareil photo, etc), il vous faudra supprimer les deux partitions créées au moment de l'écriture de l'image sur la carte SD. Vous pouvez voir les partition en sélectionnant Menu Windows/Ordinateur/bouton droit "Gérer". Voici un exemple du résultat final. Vous pouvez supprimer la partition Unix de 7 Gb (ou 4Gb en fonction de la taille de votre carte) en sélectionnant la partition puis en faisant "bouton droit Supprimer". Laissez juste une partition pour pouvoir faire les autres manipulations avec DISKPART. Démarrez l'outil DISKPART en ligne de commande. Une nouvelle fenêtre s'ouvrira. Microsoft DiskPart version 6.1.7601 Copyright (C) 1999-2008 Microsoft Corporation. DISKPART> list disk   N° disque  Statut         Taille   Libre    Dyn  GPT   ---------  -------------  -------  -------  ---  ---   Disque 0    En ligne        238 G octe

Emulateur Raspberry Pi sous Windows

Si vous souhaitez développer ou tester des applications pour Raspberry Pi, vous pouvez, soit compiler directement l'application sur Raspberry, soit la développer sous Linux ou Windows et la compiler pour Raspberry. La seconde solution est souvent plus simple car elle permet de disposer d'un environnement de compilation complet tel qu'Eclipse pour le développement. Une fois l'application développée, il faut la tester sur Raspberry. Là, il faut copier l'application en utilisant un client FTP ou SCP, puis se connecter en SSH et lancer l'exécutable. Il existe un autre moyen de tester une application Raspberry sans avoir à l'allumer. Il suffit de passer par un émulateur tel que QEMU qui permet de lancer un OS pour processeur ARM sous Linux ou Windows. L'émulateur sous Windows 1. Récupérez l'émulateur à l'adresse suivante : http://sourceforge.net/projects/rpi-emulator-win32/ . 2. Dézippés le contenu de l'image Rpi-Occidentalis-v02-qemu.7z av