Projets
Pages enfant
  • 3.3.4 Accès aux données avec JPA

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Par défaut, les applications esup-blank et esup-example sont configurées avec les gestionnaires de base de données s'appuyant sur Hibernate.

Les gestionnaires de bases de données

Le choix du gestionnaire de base de données Hibernate doit se faire en fonction de la maîtrise qu'a le développeur de la base de données. Deux cas se présentent :

...

Bloc de code
<bean
    id="databaseManager2"
    class="[...].hibernate.BasicHibernateDatabaseManagerImpl" >
  <property
    name="sessionFactoryBeanName"
    value="sessionFactory" />
</bean>

Les session factories (« usines à session »)

Les trois beans sessionFactory, createSessionFactory et updateSessionFactory (le premier seulement si l'on ne maîtrise pas la structure de la base de données) héritent tous du même bean abstrait abstractHibernateSessionfactory :

...

  • L'accès normal à la base de données s'appuie sur le bean sessionFactory (accès web et accès batch),
  • La création se fait en instanciant le bean createSessionFactory (via la tâche ant init-data),
  • La mise à jour se fait en instanciant le bean updateSessionFactory (via la tâche ant upgrade).

Mapping avec la base de données

Les fichiers de mapping sont dans le répertoire /properties/dao/hibernate/mapping et portent, par convention, l'extension .hbm.xml.

...

    <value>classpath:/properties/dao/hibernate/mapping/Population.hbm.xml</value>
Une fois ce travail effectué, vous pouvez directement lancer la target init-data du fichier build-devel.xml !

Utilisation de HQL

HQL est un langage d'interrogation de base de données de Hibernate. Il est orienté objet et a une forme proche du SQL mais travaille sur les objets Java définis dans vos fichiers de mapping et pas sur des noms de tables de votre base de données.

...

exercice
Modifier le mapping Hibernate
Modifier le mapping Hibernate

Écrire la classe Entry. Ecrire le fichier de mapping correspondant et le référencer depuis dao.xml. Exécuter la tâche ant init-data et vérifier que la table correspondante a bien été créée dans la base de données.

solution

Créer le fichier Entry.hbm.xml en prenant modèle sur une fichier existant :

Bloc de code
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.esupportail.formation.domain.beans">
  <class name="Entry" table="d_entry">
    <id name="id" type="long">
          <column name="id"/>
          <generator class="native" />
    </id>
    <property name="value" type="string">
          <column name="valu" length="250" not-null="true" unique="true"/>
    </property>
    <property name="date" type="timestamp">
          <column name="dat" not-null="true"/>
    </property>
  </class>
</hibernate-mapping>

 Ajouter la référence au fichier Entry.hbm.xml dans le fichier properties/dao/dao.xml

Bloc de code
<property name="mappingLocations">
  <list>
    <value>
      classpath:/properties/dao/hibernate/mapping/Entry.hbm.xml
    </value>
.../...
  </list>
</property>

Ecrire ensuite la classe Entry dans le package xxx.domain.beans :

Bloc de code
import java.sql.Timestamp;

Class Entry {

 private long id;

 private String value;

 private Timestamp date;

 public Entry() {}

 public boolean equals(final Object obj) {
 if (obj == null) { return false; }
   if (!(obj instanceof Entry)) { return false; }
   return id == ((Entry) obj).getId();
 }

 /* getters and setters (OBLIGATOIRE pour Hibernate !!!) */
}

Comment ça marche

Comme vu plus haut, les points d'entrée de esup-commons s'assurent du respect du modèle one-session-per-request.

...