Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Un outil de mapping
objet/relationnel pour le monde Java
Yves Bekkers
Transparence de la persistence
Hibernate
Base de donnes + donnes de config = Sans Hibernate Avec Hibernate
service de persistance Mapping objet-relationnel
Persistance automatise et transparente SGBD
ddobjets
objets mtiers - classes Java - vers une
bases de donnes relationnelles SGBD
Description de la connection
Hibernate
JDBC
Application
Event
Un premier exemple Objets id
persistants
titre
Hibernate
Agenda compos dvnements date
config.xml mapping
Base de donnes
DTD du dialecte
hibernate-mapping
lment <class>
Permet dassocier une classe Java une table de la
base de donnes
<!DOCTYPE hibernate-mapping PUBLIC Ce sont les classes dentits persistantes
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" Attributs de llment <class>
"http://hibernate.sourceforge.net/hibernate- Attribut name : nom de la classe Java
mapping-3.0.dtd"> Attribut table : nom de la table correspondante
<class name="Event" table="EVENTS">
...
</class>
Contenu : voir suite
lment
l t <property> Attributs de lllment
lment <id>
name : nom de lattribut dans la classe Java
column : (optionnel) nom de la proprit dans
la table SQL
type : (optionnel) type de mapping Hibernate
de lidentifiant
Hibernate - Y. Bekkers 31 Hibernate - Y. Bekkers 32
persistantes
persistantes. Query.scroll()
find() Persistant
getReference()
Une instance est dans un des trois tats : Query.getResultList()
Query.getSingleResult() Evict()
update()
saveOrUpdate()
Ramasse-miette
Rendre persistante les modifications apportes Rendre persistante les modifications apportes
une instance persistante une instance dtache
Pas de mthode particulire Pas de surveillance possible des instances dtaches
ncessit de r-attacher les instances en rendant persistant les
Toute modification dune instance persistante modifications apportes
transactionnelle (objet charg, sauvegard, cr ou session.merge(objet)
requt par la Session) est rendu persistant par la Effectue un SELECT avant llUPDATE pour rcuprer les donnes
mthode flush() dans la base et les fusionner avec les modifications apportes
Retourne linstance persistante correspondante
Surveillance (dirty checking) de toutes les instances En accord avec les spcifications EJB 3.0
persistantes par la session session.update(objet)
Instance persistante modifie = instance sale (dirty) Force la mise jour (UPDATE) de lobjet dans la base
Lve une exception si une instance de mme identificateur existe
Synchronisation avec la base dfinitive une fois la dans la Session
transaction sous-jacente valide
Hibernate - Y. Bekkers 47 Hibernate - Y. Bekkers 48
Dtacher/rattacher un objet
Mthodes dune session et requtes sql
persistent - 1
save() et persist()
SQL INSERT
Premire unit de travail
delete() Session session = HibernateUtil
SQL DELETE .getSessionFactory().getCurrentSession();
g y g
update() ou merge() session.beginTransaction();
SQL UPDATE.
Personne aPerson = (Personne) session
Modification dune instance persistante dtecte au
moment du flush() .load(Personne.class, personId);
SQL UPDATE. session.getTransaction().commit();
saveOrUpdate() and replicate() Lobjet aperson est dtach
INSERT ou UPDATE.
Dtacher/rattacher un objet
Objets Hibernate utiliss
persistent - 2
Seconde unit de travail org.hibernate.SessionFactory;
Session session2 = HibernateUtil org.hibernate.cfg.Configuration;
.getSessionFactory().getCurrentSession();
g y g org.hibernate.Session;
g
session2.beginTransaction(); org.hibernate.Transaction;
aPerson.setAge(age);
session2.update(aPerson);
Lobjet aperson est de nouveau persistant
Requte SQL
Requtes HQL
La mthode list() rend en rsultat une liste de tableaux dOject
List<Object[]> result = sess.createSQLQuery( result = sess.createQuery("from Personne p,
"SELECT * FROM personne").list(); Vedette v where p.p=v.id.p and v.id.f=18
for (Object[] o : result) { order by p.nom asc").list();
Integer
g p = (Integer)o[0];
g for (Object[] o : result) {
String nom = (String)o[1]; Personne p = (Personne)o[0];
String email = (String)o[2]; Vedette v = (Vedette)o[1];
... ...
} }
Chaque objet du tableau est un attribut typ de la ligne rsultat On obtient deux objets une Personne et une Vedette
par ligne rsultat
Hibernate - Y. Bekkers 59 Hibernate - Y. Bekkers 60
...
Association unidirectionnelle plusieurs 1
}
session.save(p); session.save(theEvent);
tx.commit(); tx.commit();
return p; return theEvent;
} }
Excution de requtes
Requtage si on ne connat pas didentifiant
Nom de classe
Par une requte simple
Quand utiliser les requtes session.beginTransaction();
Lorsque lon ne connait pas lidentification dune entit List<Event> result = session.createQuery("from
Event").list();
Deux sortes de requtes session.getTransaction().commit();
HQL
List cats = session.createQuery( "from Cat as cat
where cat.birthdate < ?") Par une requte paramtre
.setDate(0, date) session.beginTransaction();
.list(); List<Personne> result = session.createQuery("from
SQL PERSONNE as p WHERE p.nom = ?")
List cats = session.createSQLQuery( "SELECT {cat.*} .setString(0,nom).list();
FROM CAT {cat} WHERE ROWNUM<10", "cat", Cat.class session.getTransaction().commit();
).list();
Commencent 0 (et non 1 comme JDBC)
!
Hibernate - Y. Bekkers 87 Hibernate - Y. Bekkers 88
Identifiants composs
Chargement la demande
<composite-id>
<key-property name="nom"/>
<key-property name="prnom"/>
</composite-id>