Bonjour,
Une nouvelle formation vient d’être publiée :
« Hibernate: contexte de persistance et flushing » de la série « Hibernate : l’essentiel » créée par Hachim Idrissi Yassine.
Lien de la formation :
https://www.proflibre.com/JAVA_:_HIBERNATE/Hibernate:_Contexte,_Flushing/6
Lien de la série complète :
https://www.proflibre.com/?serie=55
Lien Youtube :
https://www.youtube.com/watch?v=GIRL2dYYID0
L’objectif de cette formation est de comprendre le contexte de persistance et le flushing, que ce soit avec l’API Native ou l’API JPA d’Hibernate.
N’hésitez pas à poser vos questions sur la page dans le site ou sur Youtube, vos remarques nous intéressent aussi.
Vous pouvez également passer le quizz à la fin pour tester vos connaissances.
Merci et à la prochaine formation sur https://www.proflibre.com
4. Introduction
L’objectif de cette formation est de
comprendre le contexte de persistance et le
flushing, que ce soit avec l’API Native ou
l’API JPA d’Hibernate.
4
www.proflibre.com
5. Prérequis
Ayant consulté la formation « [Hibernate]
Vue d’ensemble » :
https://www.proflibre.com/
JAVA_:_HIBERNATE/[Hibernate]_Vue_d
%E2%80%99ensemble/1
5
www.proflibre.com
6. Contexte de persistance
L'API Native avec son interface
org.hibernate.Session et l'API JPA avec son
interface javax.persistence.EntityManager
représentent un contexte pour traiter les
données persistées ou à persister. Ce concept
est appelé un contexte de persistance. Les
données (ou entités) sont à un état
spécifique (à un instant T) par rapport à la
fois à un contexte de persistance et à la base
de données utilisée.
6
www.proflibre.com
7. Contexte de persistance
Règle :
Nous ne pouvons maintenir qu'un seul
objet (entité) avec le même identifiant
dans un contexte de persistance. Cela
ressemble au concept de la clé primaire
pour les SGBD relationnels.
7
www.proflibre.com
8. Cycle de vie
Cycle de vie : l’ensemble des
états par lesquels passe une
entité obligatoirement (ou
pas), par rapport à un
contexte de persistance :
Session ou EntityManager.
8
www.proflibre.com
9. Cycle de vie
1. L’état transitoire (Transient = created = new) :
L'entité vient d'être instanciée et n'est pas associée à un
contexte de persistance. Elle n'a pas de représentation
persistante dans la base de données et généralement
aucun identifiant ne lui a été attribué encore (sauf si la
stratégie de génération assigned a été utilisée).
è L’objet n’a jamais été persisté au préalable, il
n’est associé à aucune session ou entityManager.
9
www.proflibre.com
10. Cycle de vie
2. L’état persisté (Managed = persistent):
L'entité a un identifiant et associée à un contexte
de persistance. Elle peut exister physiquement
ou pas encore dans la base de données.
è L’objet est associé à un contexte avec
un identifiant unique : deux objets avec le
même identifiant ne peuvent pas se
trouver dans un même contexte de
persistance.
10
www.proflibre.com
11. Cycle de vie
3. L’état détaché (Detached) :
L'entité a un identifiant mais n'est plus associée à
un contexte de persistance (généralement lorsque
le contexte de persistance est vidé, fermé ou que
l'instance a été expulsée du contexte)
è L’objet a été précédemment à l’état persisté mais
il n’est plus associé au contexte : c’est possible de le
rattacher à nouveau avec L’objet Session. L’objet
EntityManager n’offre pas malheureusement cette
possibilité.
11
www.proflibre.com
12. Cycle de vie
4. L’état supprimé (Removed):
L'entité a un identifiant et a été associée à
un contexte de persistance auparavant.
Cependant, il est prévu d’effectuer la
suppression dans la base de données au
moment du flushing ou du commit.
12
www.proflibre.com
13. Cycle de vie : vérifier l’état d’un
objet
Vérification de l'état avec l’API JPA :
boolean contained = entityManager.contains(obj);
Vérification de l'état avec l'API Native :
boolean contained = session.contains(obj);
Remarques :
Si contained retourne true, cela signifie que l’objet obj dispose forcément d’un
identifiant et qu’il est à l’état persisté.
Si contained retourne false et :
- que L’objet a un identifiant et a été persisté auparavant, il est considéré à
l’état détaché.
- si l’objet n’a pas d’identifiant et/ou n’a jamais été persisté auparavant, il est
considéré à l’état transitoire.
13
www.proflibre.com
14. Le Flushing
Le flushing est la validation des modifications
dans la base de données à partir d’un contexte de
persistance. Les deux interfaces EntityManager
et Session exposent un ensemble de méthodes
qui modifient l'état de persistance d'une entité.
Syntaxe :
session.flush(); ou entityManager.flush();
14
www.proflibre.com
15. Le Flushing
Le flushing est donné par l’option
org.hibernate.flushMode pour l’API Native par
le biais d’un objet Session à travers quatre
stratégies différentes.
Tandis que L’API JPA (objet EntityManager) ne
définisse que deux stratégies de flushhing
(AUTO et COMMIT) via l’option
javax.persistence.flushModeType
15
www.proflibre.com
16. Le Flushing - Options de flushing
1. ALWAYS (Session uniquement)
Flush la session avant chaque requête sur la base
de données. Ce mode déclenche un flushing du
contexte de persistance même lors de l'exécution
d'une requête SQL native.
2. AUTO (Session et EntityManager)
Il s'agit du mode par défaut : il ne met à jour le
contexte de persistance que si nécessaire.
16
www.proflibre.com
17. Le Flushing - Options de flushing
3. COMMIT (Session et EntityManager)
Le contexte de persistance essaie de retarder le flushing
jusqu'à ce que la transaction en cours soit validée, bien
qu’il puisse se mettre à jour prématurément : on peut donc
parler d’un forçage de validation en fin de transaction pour
assurance.
4. MANUAL (Session uniquement)
Le flushing de session est délégué à l'application, qui est
obligée d’appeler Session.flush() explicitement afin
d'appliquer les changements de contexte de persistance.
17
www.proflibre.com
18. Le Flushing : changement et
vérification
Syntaxe pour changer la stratégie de flushing avec Session :
session.setHibernateFlushMode(FlushMode.COMMIT);
Afficher la stratégie de flushing utilisée avec Session :
session.getHibernateFlushMode();
Syntaxe pour changer la stratégie de flushing avec
EntityManager :
entityManager.setFlushMode(FlushModeType.AUTO);
Afficher la stratégie de flushing utilisée avec EntityManager :
entityManager.getFlushMode();
18
www.proflibre.com
19. Le Flushing : remarque
Remarque :
Les modifications apportées aux instances persistées sont détectées de
façon automatique au moment du flushing, Il n'est pas nécessaire
d'appeler explicitement une méthode particulière pour rendre vos
modifications persistantes.
Exemple :
PersonneAnnot person = session.byId(PersonneAnnot.class).load(id);
person.setNom("Hachim IDRISSI YASSINE");
session.flush();
19
www.proflibre.com
21. Conclusion
Dans l’étape suivante, nous allons découvrir
comment gérer les transactions avec les
deux APIs d’Hibernate.
21
www.proflibre.com
22. www.proflibre.com 22
Merci de votre attention.
Vous pouvez poser des questions ou laisser des
remarques dans la zone des commentaires sur la
page de cette formation. D’autres formations qui
pourront vous intéresser sont publiées sur
ProfLibre.com régulièrement.
Vous pouvez aussi passer le Quizz sur la même
page pour tester vos connaissances. Et n’oubliez
pas de vous abonner à notre chaîne Youtube et
partager avec vos collègues.
A très bientôt !
L’équipe ProfLibre.com