Академический Документы
Профессиональный Документы
Культура Документы
Objet JPA
@Entity
public class Vin implements java.io.Serializable {
• Javabeans synchronisables public Long getId() { // getters – setters, générés par Eclipse
avec la base de données return id;
}
• Autres noms: Hibernate, EJB3 public void setId(Long id) {
this.id = id;
}
public String getNomVin() {
return nomVin;
}
}
Vin vin = new Vin(nomV, cepage, annee); protected synchronized Manager initialValue() {
em.persist(vin); return (new Manager());
tx.commit(); // or tx.rollback(); }
ejb3_utility.Manager.close(); };
Manager.java (partiel)
private EntityManager em = null;
public static EntityManager open() { Création d’un projet contenant
Manager manager = (Manager) threadManager.get();
if (manager.em == null) {
des JPAs
Manager.emf = Persistence
.createEntityManagerFactory("NomDeManager");
manager.em = Manager.emf.createEntityManager();
manager.em.setFlushMode(FlushModeType.COMMIT);
}
return manager.em;
}
Faculté I&C, Claude Petitpierre 9 Faculté I&C, Claude Petitpierre 10
Introduire un objet
dans la base de données
Intégration d'un JPA dans un projet
javax.persistence.EntityManager em = ejb3_utility.Manager.open();
javax.persistence.EntityTransaction tx = em.getTransaction();
• Structure selon Usager.java tx.begin();
Vin vin = new Vin(nomV, cepage, annee);
• Introduire le JPA dans les ManagedBean, s'il est em.persist(vin);
affiché dans une JSF // les modifications faites ici sont aussi introduites dans la BD
• Introduire son package.nom dans persistence.xml tx.commit(); // or tx.rollback();
ejb3_utility.Manager.close();
Opération merge
Modification d’un objet dans la BD: merge()
Manager
p = new Personne() Deuxième
• A la fin d'une méthode, avant de retourner à la page transaction
à afficher dans le navigateur, on doit naturellement
Personne Personne
fermer la transaction. Personne
p
• Lorsque l'on affiche un objet sur une page, on n'est p1
donc plus dans la transaction
• Lorsque l’utilisateur demande à la page de
em.persist(p)
transmettre les modifications (<form action=" ">), elle Première p1 = em.merge(p)
appelle une nouvelle action transaction
• Dans cette action, il faut ouvrir une nouvelle
DB
transaction et y réintroduire l'objet Æ merge() pour
que les modifications soient enregistrées dans la BD
// les modifications de p1 sont transmises dans la BD
5
Personne Personne Personne
id=3 Personne Personne
session id=3 id=3
Personne Personne
p1
p Id : 5 Id : 5
merge d'un objet déjà dans la transaction merge d'un objet déjà dans la transaction
Manager Manager
5 Personne
p2
5 Id : 5
mémorisation
mémorisation p1 Personne p3 copie du contenu
p1 Personne p3 Personne
Id : 5 p4
Personne
Id : 5 Id : 5
Id : 5
p4 = em.merge(p2)
p3 = em.merge(p1)
p3 = em.merge(p1)
On suppose que p1 et p2 ont été créés par un moyen quelconque, par exemple
On suppose que p1 et p2 ont été créés par un moyen quelconque, par exemple en introduisant directement 5 dans l' id. Le premier merge introduit p3 dans la
en introduisant directement 5 dans l'id transaction
Si l'id est déjà référencé, le contenu du nouvel objet est copié dans l'objet Comme l' id de p2 est déjà référencé, le deuxième merge copie le contenu du
référencé et l'objet référencé est retourné nouvel objet dans l'objet p3 puis la référence de cet objet est retournée dans p4
Business
Personne p; Personne
public void action() {
...
p = em.merge(p);
...
}
Faculté I&C, Claude Petitpierre 21 Faculté I&C, Claude Petitpierre 22
Dans Marchand
(il faut choisir un @OneToOne(mappedBy="marchand") @OneToMany(mappedBy="marchand")
Dans Marchand
côté pour mappedBy) private Vin vin; private Collection<Vin> vins;
// Getters – setters pour les deux champs // Getters – setters pour la collection et pour le champ marchand
@ManyToOne
@OneToOne
private Marchand marchand;
private Marchand marchand;
// les instructions d'un seul côté suffisent // Les vins sont automatiquement "mergés" quand
// pour entrer la relation dans la BD // on parcourt la collection
c1 = em.merge(c) c1 = em.merge(c)
et = em.merge(et)
c1 Cours c1 Cours et Etudiant
Manager id=3 pas de copie Manager
id=3 id=4
id: 3, 8, 4, 7 3, 8, 4, 7
c1 Cours c1 Cours
BD id=3 Les modifications sur id=3
Etudiant Etudiant Etudiant Etudiant Etudiant
id=8 id=4 id=7 les objets bleus sont id=8 id=7
extraction répercutées dans la BD
Faculté I&C, Claude Petitpierre Faculté I&C, Claude Petitpierre
merge()
Client client = (Client)result.getSingleResult();
Mises à jour
// détaché, son id est initialisé
tx.begin(); Quand un objet attaché est mis à jour, ses modifica-
client2 = em.merge(client); tions sont suivies dans le manager et lors du commit,
// attaché, les modifications seront enregistrées au commit elles sont transmise dans la base de données.
tx.commit(); Il en est de même avec les relations.
Pour vérifier que le système réagit selon nos plans, il
// em.merge() retourne une copie intégrée dans la transaction suffit d'afficher les tables en utilisant le moniteur de
// Donc attention, si client est enregistré dans la session MySQL
// HTTP, il faudra le ré-enregistrer dans cette session !
Faculté I&C, Claude Petitpierre 37 Faculté I&C, Claude Petitpierre 38
Utilisation de JQL
JQL Query result = em.createQuery("SELECT v FROM Vin v");
vin = (Vin)result.getSingleResult(); // une seule ligne,
// une exception est jetée si la commande
Adaptation de SQL aux JPA
// en définit plusieurs
MySQL
Transactions gérées par version Pour initialiser MySQL sur les stations de la salle de l'EPFL, aller à la
page http://www.mysql.com/downloads/mysql/ et charger l'avant-dernier
(gestion correcte sans concurrence) fichier .zip dans votre répertoire.
Ouvrir une fenêtre terminal, aller dans le répertoire bin du nouveau
public void modifierAvecLecture() { répertoire et appeler
try { mysqld –u root –console ou simplement mysqld
javax.persistence.EntityManager em = ejb3_utility.Manager.open();
Les mots de passe, si vous en utilisez, doivent être entrés dans le
fichier persistence.xml. Ouvrir ensuite une nouvelle fenêtre et appeler:
Query result = em.createQuery(
"SELECT p FROM Produit2 p WHERE p.nom='" + nom + "'"); mysql
Produit2 prod = (Produit2) result.getSingleResult(); Vous pouvez ensuite taper des commandes telles celles-ci:
// prod obtient la dernière valeur de la version
use test
// suite comme dans le transparent précédent
show tables;
select * from vin;
Documentation:
Site App Engine > Getting started
• Getting started > Java (overview)
• Java (JPA)