Objectif : Utiliser Hibernate avec PostgreSQL dans un exemple simple.
Cet outil permet de sauvegarder des objets dans une table d'une base de donn�es mais aussi de manipuler chaque enregistrement d'une table comme un objet JAVA.

Pr�requis:

Pr�paration de la base de donn�es


Cr�ation de la base de donn�es "firsthibernate"
CREATE DATABASE firsthibernate
  WITH OWNER = postgres
       ENCODING = 'SQL_ASCII'
       TABLESPACE = pg_default;

Ce script cr�e une base de donn�es propre � notre exemple.

Cr�ation de la table "Contact"
CREATE TABLE CONTACT (
  id SERIAL,
  FIRSTNAME text, 
  LASTNAME text, 
  EMAIL text, 
  PRIMARY KEY(id)
);

Cette table stockera tous les contacts de notre application.

Pour ces op�rationssur la base de donn�es, on pourra passer par l'outil d'administration des base PostgreSQL : "pgAdmin".

Image de la base de donn�es

"Contact.java"
package test.hibernate;

public class Contact
{
    private String firstName;
    private String lastName;
    private String email;
    private long id;

    public String getEmail()
    {
      return email;
    }

    public String getFirstName()
    {
      return firstName;
    }

    public String getLastName()
    {
      return lastName;
    }
    
    public void setEmail(String string)
    {
      email = string;
    }

    public void setFirstName(String string)
    {
      firstName = string;
    }

    public void setLastName(String string)
    {
      lastName = string;
    }

    public long getId()
    {
      return id;
    }

    public void setId(long l)
    {
      id = l;
    }
}

La classe Java "Contact" repr�sente la table "CONTACT" et r�ciproquement. On peut cr�er une instance de cette classe Java et l'ajouter en base, mais aussi parcourir la table et recr�er les instances Java que l'on souhaite.

Question : Les variables d'instances sont simples, mais qu'en est-il avec des instances de classe JAVA ?
Réponse : Il est aussi possible d'utiliser des classes plus complexes que Contact. Chercher des exemples avec google en utilisant les mots-cle "hibernate many-to-one".

Acc�s � la table

"hibernate.cfg.xml"
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
      <property name="hibernate.connection.driver_class"
        >org.postgresql.Driver</property>
      <property name="hibernate.connection.url"
        >jdbc:postgresql://localhost/firsthibernate</property>
      <property name="hibernate.connection.username">postgres</property>
      <property name="hibernate.connection.password">infotel0</property>
      <property name="hibernate.connection.pool_size">10</property>
      <property name="show_sql">true</property>
      <property name="dialect"
        >org.hibernate.dialect.ProgressDialect</property>
      <property name="hibernate.hbm2ddl.auto">update</property>
      <!-- Mapping files -->
      <mapping resource="contact.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Le fichier "hibernate.cfg.xml" contient les param�tres de connexion � la base de donn�es. Il inclu aussi les classes � lier � une table (tag "mapping").

"contact.hbm.xml"
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class name="test.hibernate.Contact" table="CONTACT">
    <id name="id" type="long" column="ID">
      <generator class="assigned"/>
    </id>
    <property name="firstName">
       <column name="FIRSTNAME" />
    </property>
    <property name="lastName">
      <column name="LASTNAME"/>
    </property>
    <property name="email">
      <column name="EMAIL"/>
    </property>
  </class>
</hibernate-mapping>

Ce fichier permet � Hibernate de faire le lien entre la classe JAVA et la table SQL.

Liste des contacts
      public static void list()
      {
      	List personList = null;
      	Session session = HibernateUtil.currentSession();
      	// !! CASSE a respecter
      	Query q = session.createQuery("from Contact");
        personList = (List) q.list();
        Iterator iter = personList.iterator();
        System.out.println("==Liste des contacts==" );
        while( iter.hasNext() )
        {
            Contact person = (Contact) iter.next();
            System.out.println("===>'" + person.getFirstName() + "' '" 
        	    + person.getLastName() + "' mail:'"
        	    + person.getEmail() + "'");
        }
      }

Attention:

Insertion d'un contact
    public static void insert()
    {
        Session session = null;
        
        try
        {
            // This step will read hibernate.cfg.xml and prepare hibernate for use
            SessionFactory sessionFactory = new Configuration()
                .configure()
                .buildSessionFactory();
            session = sessionFactory.openSession();
            Transaction tx = session.beginTransaction();
            // Create new instance of Contact and set values in it 
            //   by reading them from form object
            System.out.println("Inserting Record");
            Contact contact = new Contact();
            contact.setId(3);
            contact.setFirstName("Deepak");
            contact.setLastName("Kumar");
            contact.setEmail("deepak_38@yahoo.com");
            session.save(contact);
            // Do the insert NOW
            tx.commit();
            System.out.println("Done");
        } catch(Exception e)
        {
          System.out.println(e.getMessage());
        } finally
        {
          // Actual contact insertion will happen at this step
          session.flush();
          session.close();
        }
        
      }
    }

Le fichier "hibernate.cfg.xml" est utilis� par d�faut pour la configuration de Hibernate.

Classe utilitaire

"HibernateUtil"
class HibernateUtil
{

  private static final SessionFactory sessionFactory;

  static
  {
    try 
    {
      // Create the SessionFactory
      sessionFactory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) 
    {
      // Make sure you log the exception, as it might be swallowed
      System.err.println("Initial SessionFactory creation failed." + ex);
      throw new ExceptionInInitializerError(ex);
    }
  }

  public static final ThreadLocal session = new ThreadLocal();

  public static Session currentSession() throws HibernateException
  {
    Session s = (Session) session.get();
    // Open a new Session, if this Thread has none yet
    if (s == null)
    {
      s = sessionFactory.openSession();
      session.set(s);
    }
    return s;
  }

  public static void closeSession() throws HibernateException
  {
    Session s = (Session) session.get();
    session.set(null);
    if (s != null)
    {
      s.close();
    }
  }
}

Cette classe encapsule des op�rations basiques, nous permettant d'all�ger un peu le code.

Execution du test

La compilation des fichiers ne requiert rien de particulier. Ce qui n'est pas le cas de l'�xecution...

Apr�s avoir cr�er une classe qui contient la m�thode liste et d'insertion, puis de l'avoir compil�e, voici la commande pour l'�xecuter:

"test.bat" (sur une seule ligne)
java -cp .;classes;C:\home\j_co\apps\JOnAS-4.7.7\lib\examples\hibernate\hibernate-3.1.2.jar;
  C:\home\j_co\apps\JOnAS-4.7.7\lib\examples\hibernate\dom4j-1.6.1.jar;
  C:\home\j_co\apps\JOnAS-4.7.7\lib\commons\jonas\jakarta-commons\commons-logging-api.jar;
  C:\home\j_co\apps\JOnAS-4.7.7\lib\commons\jonas\jakarta-commons\commons-collections.jar;
  C:\home\j_co\apps\java-libs\postgresql-8.1-407.jdbc2ee.jar;
  C:\home\j_co\apps\JOnAS-4.7.7\lib\examples\hibernate\ehcache-1.1.jar;
  C:\home\j_co\apps\JOnAS-4.7.7\lib\examples\hibernate\cglib-nodep-2.1_3.jar;
  C:\home\j_co\apps\JOnAS-4.7.7\lib\commons\j2ee\jta-spec1_0_1.jar;
  C:\home\j_co\apps\JOnAS-4.7.7\lib\examples\hibernate\antlr-2.7.6rc1.jar 
  <fichier de classe Main>

Conclusion

Le nombre de modules externes est vraiment impressionnant. Il vaudrait donc mieux utiliser JOnAS ou J2EE avec Hibernate.
La configuration est assez courte pour une classe aussi simple que "Contact". Il est raisonnable de penser qu'une base de donn�es complexe sera plus longue � interfacer avec Hibernate.

Dans la m�me optique, il serait interessant de voir ce que SQLObject (www.sqlobject.org) propose.
Par contre, il est surtout utilisable avec Python... (et pas encore avec JAVA ?)




Page accedée 1 fois.