Manipulation d`objets et opérations CRUD

Transcription

Manipulation d`objets et opérations CRUD
Manipulation d'objets et opérations CRUD
Nous avons vu précédemment quelques opérations sur la base de données : l'insertion d'une
entrée dans le chapitre Génération de la base de données, ainsi que la récupération et la
suppression des données de toute une table dans le chapitre Découverte du langage HQL.
Reprenons la classe Main commencée dans le chapitre précédent avant de compléter les
fonctions de tests :
import org.hibernate.Session;
public static void main(String[] args) {
// Ouverture d'une session Hibernate
s = HibernateUtils.getSession();
// Vide la table EVENTS de ses éventuelles entrées
clean();
// Lancement des tests successifs
testCreate();
testRead();
testUpdate();
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
testDelete();
// Fermeture de la session Hibernate
s.close();
}
Création d'un objet
Code Hibernate
import java.util.Calendar;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import fr.mistra.pgejpav1.jpa.Event;
// Création d'un event
private static void testCreate() {
System.out.println("--------- testCreate ---------");
// Création des objets à sauvegarder
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
Event e1 = new Event();
e1.setTitle("Titre du premier évènement");
e1.setDescription("Description 1");
e1.setBeginDate(Calendar.getInstance());
e1.setAllDay(true);
Event e2 = new Event();
e2.setTitle("Deuxième évènement");
e2.setDescription("Description du deuxième évènement");
e2.setBeginDate(Calendar.getInstance());
e2.setAllDay(false);
// Début de la transaction
Transaction tx = s.beginTransaction();
// Sauvegarde des objets
s.save(e1);
s.save(e2);
// Fermeture de la transaction
tx.commit();
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
// Affiche le contenu de la table EVENTS
print();
}
Comme toujours, nous débutons une transaction (ligne 25) avant toute opération sur la base de
données, et la fermons une fois celles-ci terminées (ligne 30). Les opérations de sauvegarde
s'effectue à l'aide de la méthode save() de la session Hibernate (lignes 27 et 28).
Lancement du test
Lançons le programme et observons les traces d'exécution affichées :
--------- Vide la table events : --------Hibernate:
delete
from
events_01
--------- testCreate --------Hibernate:
/* insert fr.mistra.pgejpav1.jpa.Event
*/ insert
into
events_01
(events_allDay, events_beginDate, events_description, events_title)
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
values
(?, ?, ?, ?)
Hibernate:
/* insert fr.mistra.pgejpav1.jpa.Event
*/ insert
into
events_01
(events_allDay, events_beginDate, events_description, events_title)
values
(?, ?, ?, ?)
--------- Contenu de la table events : --------Hibernate:
/*
from
Event */ select
event0_.events_id as events1_0_,
event0_.events_allDay as events2_0_,
event0_.events_beginDate as events3_0_,
event0_.events_description as events4_0_,
event0_.events_title as events5_0_
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
from
events_01 event0_
Event : [id] = 1 [title] = Titre du premier évènement [desc] = Description 1 [date] = 13 juil. 2010
10:56:31 [allDay] = true
Event : [id] = 2 [title] = Deuxième évènement [desc] = Description du deuxième évènement
[date] = 13 juil. 2010 10:56:31 [allDay] = false
Lignes 8 à 14, nous pouvons observer la traduction de la méthode save() d'Hibernate en la
requête SQL insert into.
L'effet de cette insertion (et de celle qui la suit) se vérifient grâce à notre méthode clean : les
lignes 35 et 36 rapportent la liste des entrées présentes dans la table events, qui correspondent
bien aux deux objets que nous voulions ajouter.
Récupération d'un objet
Maintenant que nous savons comment ajouter un objet, voyons comment le récupérer depuis la
base de données pour l'utiliser dans le programme Java.
Pour ce faire, complétons la méthode testRead(). Ici, il n'est pas nécessaire d'utiliser une
transaction: étant donné qu'aucune modification n'est faite sur la base de données, aucune
synchronisation n'est nécessaire.
Nous allons utiliser une requête HQL permettant de faire un select contenant une clause where.
Nous avons choisi ici de récupérer l'objet Event dont le titre est "Titre du premier évènement",
mais le code peut être modifié pour porter sur n'importe quel attribut de la classe.
Code Hibernate
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
import java.util.Calendar;
import org.hibernate.Query;
import org.hibernate.Session;
import fr.mistra.pgejpav1.jpa.Event;
// Lecture d'un event
private static void testRead() {
System.out.println("--------- testRead ---------");
// Récupération de l'Event d'après son titre
Query q = s.createQuery("from Event where title= :myTitle");
q.setString("myTitle", "Titre du premier évènement");
Event e = (Event) q.uniqueResult();
// Affichage de l'objet récupéré
System.out.println("Event : [id] = " + e.getId() + "\t" +
"[title] = " + e.getTitle() + "\t" +
"[desc] = " + e.getDescription() + "\t" +
"[date] = " + e.getBeginDate().getTime().toLocaleString() + "\t" +
"[allDay] = " + e.isAllDay());
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
}
Arrêtons-nous plus longuement sur les lignes 11 à 13. La requête SQL que l'on cherche à écrire
est : select from events where events_title = "Titre du premier évènement";
La partie fixe, "select from events where events_title =", se traduit en HQL par : from Event
where title =En effet, le HQL est un langage de requêtage orienté objet: nous utilisons donc les
noms des entités et des attributs et non ceux des tables et des colonnes (ligne 12).
La partie variable comportant le titre que l'on recherche est introduite dans la requête par
l'insertion de la variable :myTitle. Notez les deux points qui permettent d'indiquer que c'est un
paramètre dont la valeur doit être précisé. Pour la préciser, nous utilisons la méthode setString
(ligne 13), prenant en paramètre deux chaines de caractères : la première correspond au nom
du paramètre (ici myTitle), la deuxième à la valeur de celui-ci.
Enfin, nous récupérons le résultat de cette requête à l'aide de la méthode uniqueResult().
Précédemment, dans la méthode print(), nous avions utilisé la méthode list() pour récupérer une
liste de résultats. Ici, nous savons qu'il n'existe qu'une seule entrée dont le titre est celui passé
en paramètre de la requête. Nous pouvons donc utiliser la méthode uniqueResult() en castant
le résultat en Event.
Lancement du test
Lors de l'exécution, l'objet récupéré est affiché grâce aux lignes 15 à 20:
--------- testRead --------Hibernate:
/*
from
Event
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
where
title= :myTitle */ select
event0_.events_id as events1_0_,
event0_.events_allDay as events2_0_,
event0_.events_beginDate as events3_0_,
event0_.events_description as events4_0_,
event0_.events_title as events5_0_
from
events_01 event0_
where
event0_.events_title=?
Event : [id] = 1 [title] = Titre du premier évènement
2010 11:53:44 [allDay] = true
[desc] = Description 1 [date] = 13 juil.
Modification d'un objet
Code source de la méthode
Découvrons maintenant comment modifier un objet préalablement présent en base de données
et enregistrer cette modification :
import org.hibernate.Query;
import org.hibernate.Session;
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
import org.hibernate.Transaction;
import fr.mistra.pgejpav1.jpa.Event;
// Modification d'un event
private static void testUpdate() {
System.out.println("--------- testUpdate ---------");
System.out.println("Avant modification");
print();
// Récupération de l'Event d'après son titre
Query q = s.createQuery("from Event where title= :myTitle");
q.setString("myTitle", "Titre du premier évènement");
Event e = (Event) q.uniqueResult();
// Modifications des attributs de l'objet
e.setDescription("Description modifiée");
e.setAllDay(false);
// Prise en compte de la modification
Transaction tx = s.beginTransaction();
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
s.update(e);
tx.commit();
System.out.println("Après modification");
print();
}
Jusqu'à la ligne 19, rien de nouveau, nous récupérons un objet provenant de la base de
données et modifions certains de ses attributs. Ligne 22, nous débutons la désormais
traditionnelle transition Hibernate, puisque les modifications à prendre en compte nécessitent
une synchronisation avec la base de données.
Pour enregistrer une modification, la session Hibernate fournit une méthode update(), à laquelle
est fournie en paramètre l'objet à mettre à jour (ligne 23). Enfin, le commit() de la ligne 24
synchronise l'objet modifié.
Lancement du test
Pour vérifier le bon fonctionnement de la modification, les traces d'exécution affichent le
contenu de la table avant et après la modification de l'objet:
--------- testUpdate --------Avant modification
Event : [id] = 1 [title] = Titre du premier évènement
2010 12:06:13 [allDay] = true
[desc] = Description 1 [date] = 13 juil.
Event : [id] = 2 [title] = Deuxième évènement [desc] = Description du deuxième évènement
[date] = 13 juil. 2010 12:06:13 [allDay] = false
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
Après modification
Event : [id] = 1 [title] = Titre du premier évènement
13 juil. 2010 12:06:13 [allDay] = false
[desc] = Description modifiée
[date] =
Event : [id] = 2 [title] = Deuxième évènement [desc] = Description du deuxième évènement
[date] = 13 juil. 2010 12:06:13 [allDay] = false
Suppression d'un objet
Code source de la méthode
La dernière opération CRUD à réaliser est la suppression d'un objet dans la base de données.
Pour ce faire, nous allons procéder de façon similaire à la modification, hormis le fait que l'appel
à la méthode update() est remplacé par un appel à la méthode delete(), appartenant elle aussi
à la session Hibernate:
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import fr.mistra.pgejpav1.jpa.Event;
// Suppression d'un event
private static void testDelete() {
System.out.println("--------- testDelete ---------");
System.out.println("Avant suppression");
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
print();
// Récupération de l'Event d'après son titre
Query q = s.createQuery("from Event where title= :myTitle");
q.setString("myTitle", "Titre du premier évènement");
Event e = (Event) q.uniqueResult();
// Enregistrement de la suppression
Transaction tx = s.beginTransaction();
s.delete(e);
tx.commit();
System.out.println("Après suppression");
print();
}
Lancement du test
Là encore, les traces d'exécution nous permettent de contrôler le bon fonctionnement de notre
test :
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
--------- testDelete --------Avant suppression
Event : [id] = 1 [title] = Titre du premier évènement
13 juil. 2010 14:20:29 [allDay] = false
[desc] = Description modifiée
[date] =
Event : [id] = 2 [title] = Deuxième évènement [desc] = Description du deuxième évènement
[date] = 13 juil. 2010 14:20:29 [allDay] = false
Après suppression
Event : [id] = 2 [title] = Deuxième évènement [desc] = Description du deuxième évènement
[date] = 13 juil. 2010 14:20:29 [allDay] = false
Arrivé à ce point du tutoriel, nous savons désormais comment mapper une classe et comment
manipuler les objets mappés. Mais un projet utilisant Hibernate nécessite bien évidemment
plusieurs classes, souvent liées entre elles par diverses associations, qu'il faut elles aussi
mapper et transformer en clés étrangères ou en tables de jointure. C'est notamment le cas de
l'étude de cas que nous vous proposons.
Hibernate possède des annotations différentes selon le type d'association (1--1, 1--n, n--n),
nous allons donc les découvrir au fur et à mesure du développement de notre projet.
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Manipulation d'objets et opérations CRUD
.
Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected]
Powered by TCPDF (www.tcpdf.org)

Documents pareils