<!-- Slide number: 1 -->
Accès aux donnéesvia JPA
Frédéric Claux - 2019
<!-- Slide number: 2 -->
Plan
Données et état des données dans JPA
Insertion de données
Suppression de données
Mise à jour de données
Requêtage
<!-- Slide number: 3 -->
Publicité
Etat des données en JPA

https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate
Notes:
https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate
<!-- Slide number: 4 -->
Insertion de données
Suppliers s = new Suppliers();
// Ne pas specifier de clé primaire si elle est autogénérée
// s.setId(id);
s.setFirstName("Jean");
Publicité
s.setLastName("Dupont");
m_EM.getTransaction().begin();
m_EM.persist(s);
m_EM.getTransaction().commit();
<!-- Slide number: 5 -->
Suppression de données
m_EM.getTransaction().begin();
m_EM.remove(s);
m_EM.getTransaction().commit();
<!-- Slide number: 6 -->
Mise à jour de données
Publicité
Suppliers s = m_EM.find(Suppliers.class, 2);
m_EM.getTransaction().begin();
s.setFirstName("Jane");
m_EM.merge(s);
m_EM.flush();
m_EM.getTransaction().commit();
<!-- Slide number: 7 -->
Requêtage
JPQL
Pour: simple, très proche du SQL
Contre: typage fort contrôlé par l’IDE à l’intérieur même des chaines de caractères, mais seulement dans les @NamedQuery
Publicité
CriteriaQuery
Pour: fortement typé
Contre: très verbeux
<!-- Slide number: 8 -->
Requêtage – exemple
JPQL
SELECT c FROM Country c WHERE population > :p
CriteriaQuery
CriteriaQuery<Country> q = cb.createQuery(Country.class);Root<Country> c = q.from(Country.class);ParameterExpression<Integer> p = cb.parameter(Integer.class);q.select(c).where(cb.gt(c.get(Country_.population), p));
S’exercer durant les travaux pratiques