V. Projet Tomcat - Hibernate▲
La cinquième étape du projet consiste à créer un projet Tomcat, et les fichiers nécessaires au bon fonctionnement de Hibernate.
V-1. Création du projet Tomcat▲
Au lancement d'Eclipse, on définit un workspace, puis on coche "use this as the defut and do not ask again".
Pour créer un nouveau projet Tomcat, on va à New -> Other...
On sélectionne Dynamic Web Project dans le menu Web, puis on clique sur next.
On donne un nom à notre projet, par exemple tutorialDB, puis on clique sur New... dans Target Runtime.
On sélectionne Apache Tomcat v6.0 dans le menu Apache puis on clique sur Next.
On ajoute le chemin de tomcat dans Tomcat installation directory.
On sélectionne Apache Tomcat v6.0 dans Target Runtime.
On clique sur Finish puis sur Yes pour basculer vers Java EE perspective .
On clique sur Go to workbench pour retourner à notre projet.
Notre projet a bien été créé et voici son arborescence.
V-2. Préparation du projet▲
Maintenant on retourne dans le dossier où on a décompressé Hibernate Core pour copier les fichiers indispensable à son utilisation dans le dossier WEB-INF\lib.
Ces fichiers sont : ant-1.6.5.jar, ant-antlr-1.6.5.jar, ant-junit-1.6.5.jar, ant-launcher-1.6.5.jar, antlr-2.7.6.jar,
ant-swing-1.6.5.jar, asm.jar, asm-attrs.jar, cglib-2.1.3.jar, commons-collections-2.1.1.jar, commons-logging-1.0.4.jar,
dom4j-1.6.1.jar, ehcache-1.2.3.jar, jta.jar, log4j-1.2.11.jar, oscache-2.1.jar.
A la fin, on copie hibernate3.jar qui se trouve à la racine du dossier de Hibernate Core dans le dossier WEB-INF\lib.
On télécharge le driver JDBC pour MySQL : http://dev.mysql.com/downloads/connector/j/5.1.html
On décompresse le fichier, puis on copie le driver dans le dossier WEB-INF\lib.
V-3. Création du fichier de configuration▲
Maintenant, on va passer à la création d'un fichier de configuration pour nous connecter à notre base de données MySQL,
puis on va générer les fichiers de mapping et les classes Java correspondant aux tables de la base.
On commence par aller à New -> Others...
On choisit Hibernate Configuration File (cfg.xml) dans le menu Hibernate.
On laisse le nom à hibernate.cfg.xml puis on clique sur Next.
On sélectionne MySQL dans Database dialect, puis com.mysql.jdbc.Driver dans Driver class, on écrit l'adresse de la base de données
dans Connection URL et à la fin on met le nom d'utilisateur et le mot de passe de la base de données.
On clique sur Next.
On donne un nom à la console Hibernate par exemple : tutorialDB.
Puis on va à l'onglet Classpath .
On ajoute le driver JDBC de MySQL, puis on clique sur Finish pour créer notre fichier de configuration.
Notre fichier de configuration a bien été créé.
<?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>
<property
name
=
"hibernate.connection.driver_class"
>
com.mysql.jdbc.Driver</property>
<property
name
=
"hibernate.connection.url"
>
jdbc:mysql://localhost:3306/tutorialDB</property>
<property
name
=
"hibernate.connection.username"
>
root</property>
<property
name
=
"hibernate.dialect"
>
org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
On ajoute des propriétés au fichier de configuration :
<property
name
=
"transaction.factory_class"
>
org.hibernate.transaction.JDBCTransactionFactory</property>
<property
name
=
"current_session_context_class"
>
thread</property>
<property
name
=
"hibernate.show_sql"
>
true</property>
On va maintenant vérifier si Hibernate arrive à se connecter à MySQL.
On va à Windows -> Show View -> Others...
On sélectionne Hibernate Configurations dans le menu Hibernate.
Quand on déroule l'arborescence de la base de données, on voit bien que Hibernate arrive à se connecter à MySQL.
On passe à Java perspective pour avoir accès à Hibernate Tools.
V-4. Génération des fichiers de mapping et des classes Java▲
Maintenant, on passe à la génération de nos fichiers de mapping et des classes Java avec l'outil Hibernate Tools.
On commence par aller à Run -> Hibernate Code Generation... -> Open Hibernate Code Generation Dialog...
On crée une nouvelle configuration.
On fait un clique droit sur Hibenate Code Generation puis on sélectionne New.
Dans l'ongle Main, on commence par sélectionner notre base de données dans Console configuration, puis on ajoute le chemin du répertoire source de notre projet \tutorialDB\WEB-INF\src dans Output directory, on coche Reverse engineer from JDBC Connection, et à la fin on ajoute le nom du Package où les fichiers vont être créer.
Dans reveng.xml, on clique sur Setup... puis Create new... pour créer notre fichier reveng.xml.
On sélectionne le dossier source de notre projet, puis on clique sur Finish.
Maintenant que tout est ok dans l'onglet Main, on passe à Exporters.
Dans General settings, on coche Use Java 5 syntax.
Puis dans Exporters on coche :
- Domain code (.java) pour créer les classes Java correspondantes à nos 2 tables de la base de données, qu'on utilisera pour le développement plus tard.
- Hibernate XML Mappings (.hbm.xml) pour créer nos fichiers de mapping.
- DAO code (.java) (Data Access Object) pour créer nos objets persistants.
- Hibernate XML Configuration (.cfg.xml) pour mettre à jour notre fichier de configuration.
A la fin, on clique sur Apply puis sur Run.
Voici la nouvelle structure de notre projet.
Le package a été créé ainsi que les classes Java et les fichiers de mapping.
Maintenant, il va falloir éditer les 2 fichiers de mapping puisque Hibernate ne reconnait pas que les id des deux tables doivent être incrémenté automatiquement.
On ouvre le fichier de mapping Dept.hbm.xml, puis on change la classe du tag generator de la colonne id_dept de identity à increment.
On fait la même chose pour le fichier de mapping personnel.hbm.xml
V-5. Création de HibernateUtil.java▲
On va à New -> Package
On crée un package au nom de com.util
On va à New -> File
On crée un nouveau fichier au nom de HibernateUtil.java
On ajoute le code suivant :
package
com.util;
import
org.hibernate.*;
import
org.hibernate.cfg.*;
public
class
HibernateUtil {
public
static
final
SessionFactory sessionFactory;
static
{
try
{
// Création de la SessionFactory à partir de hibernate.cfg.xml
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
SessionFactory getSessionFactory
(
) {
return
sessionFactory;
}
}
V-6. Test d'insertion, de mise à jour, de sélection et de suppression▲
Maintenant on va procéder à la création du fichier testInsert.java pour tester si l'insertion se passe bien.
On ajoute le code suivant :
import
org.hibernate.*;
import
com.tutorialDB.Dept;
import
com.util.HibernateUtil;
public
class
testInsert {
public
static
void
main
(
String[] args)
throws
HibernateException {
Session session =
HibernateUtil.getSessionFactory
(
).getCurrentSession
(
);
session.beginTransaction
(
);
Dept d1 =
new
Dept
(
);
d1.setNomDept
(
"informatique"
);
session.save
(
d1);
session.getTransaction
(
).commit
(
);
HibernateUtil.getSessionFactory
(
).close
(
);
}
}
On va à Run -> Open Run Dialog...
On fait un clique droit sur Java Application puis on sélectionne New.
On clique sur Run pour compiler notre fichier.
L'insertion s'est bien déroulée.
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select max(id_dept) from dept
Hibernate: insert into tutorialDB.dept (nom_dept, id_dept) values (?, ?)
On vérifie avec Toad si les données ont bien été transmises.
Pour tester la mise à jour, on crée un nouveau fichier au nom de testUpdate.java, puis on ajoute le code suivant :
import
org.hibernate.*;
import
com.tutorialDB.Dept;
import
com.util.HibernateUtil;
public
class
testUpdate {
public
static
void
main
(
String[] args)
throws
HibernateException {
Session session =
HibernateUtil.getSessionFactory
(
).getCurrentSession
(
);
session.beginTransaction
(
);
Dept d1 =
(
Dept) session.load
(
Dept.class
, 1
);
d1.setNomDept
(
"finance"
);
session.save
(
d1);
session.getTransaction
(
).commit
(
);
HibernateUtil.getSessionFactory
(
).close
(
);
}
}
On crée une nouvelle configuration d'exécution puis on exécute la classe.
La mise à jour s'est bien déroulée.
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select dept0_.id_dept as id1_0_0_, dept0_.nom_dept as nom2_0_0_ from tutorialDB.dept dept0_ where dept0_.id_dept=?
Hibernate: update tutorialDB.dept set nom_dept=? where id_dept=?
On vérifie dans Toad pour voir si la mise à jour s'est bien déroulée.
Pour tester la sélection, on crée un nouveau fichier au nom de testSelect.java, puis on ajoute le code suivant :
import
java.util.Iterator;
import
org.hibernate.*;
import
com.util.HibernateUtil;
public
class
testSelect {
public
static
void
main
(
String[] args)
throws
HibernateException {
Session session =
HibernateUtil.getSessionFactory
(
).getCurrentSession
(
);
session.beginTransaction
(
);
String query =
"select d.id_dept, d.nom_dept from dept d where d.id_dept = 1"
;
Iterator results =
session.createSQLQuery
(
query).list
(
).iterator
(
);
while
(
results.hasNext
(
))
{
Object[] row =
(
Object[]) results.next
(
);
Integer id =
(
Integer) row[0
];
String nom =
(
String) row[1
];
System.out.println
(
"id_dept = "
+
id+
"| nom_dept = "
+
nom);
}
session.getTransaction
(
).commit
(
);
HibernateUtil.getSessionFactory
(
).close
(
);
}
}
La sélection s'est bien déroulée.
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select d.id_dept, d.nom_dept from dept d where d.id_dept = 1
id_dept = 1| nom_dept = finance
Pour tester la suppression, on crée un nouveau fichier au nom de testDelete.java, puis on ajoute le code suivant :
import
org.hibernate.*;
import
com.tutorialDB.Dept;
import
com.util.HibernateUtil;
public
class
testDelete {
public
static
void
main
(
String[] args)
throws
HibernateException {
Session session =
HibernateUtil.getSessionFactory
(
).getCurrentSession
(
);
session.beginTransaction
(
);
Dept d1 =
(
Dept) session.load
(
Dept.class
, 1
);
session.delete
(
d1);
session.getTransaction
(
).commit
(
);
HibernateUtil.getSessionFactory
(
).close
(
);
}
}
La suppression s'est bien déroulée.
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select dept0_.id_dept as id1_0_0_, dept0_.nom_dept as nom2_0_0_ from tutorialDB.dept dept0_ where dept0_.id_dept=?
Hibernate: delete from tutorialDB.dept where id_dept=?
On vérifie dans Toad. On voit que la suppression s'est bien déroulée.