Ressources
Vlad Mihalcea - A beginner’s guide to entity state transitions with JPA and Hibernate
TD1 JPA Cycle de vie - Mise en oeuvre de l’illustration décrite ci-dessous
JPA fait passer la mentalité du développeur des instructions SQL aux transitions d’état des entités. Une entité peut se trouver dans l’un des états suivants
| État | Description |
|---|---|
| NEW (Transitoire) | Une entité nouvellement créée, qui n’est associée à aucune ligne de la base de données, est considérée comme étant dans l’état Nouveau ou Transitoire. Lorsqu’elle devient gérée, le contexte de persistance émet une instruction INSERT lors de la phase de synchronisation (flush). |
| MANAGED (Persistant) | Une entité persistante est associée à une ligne de la base de données et est gérée par le contexte de persistance actuellement actif. Les changements d’état sont détectés par le mécanisme de dirty checking et sont propagés vers la base de données sous forme d’instructions UPDATE lors de la phase de synchronisation (flush). |
| DETACH | Lorsque le contexte de persistance actif est fermé, toutes les entités précédemment gérées deviennent détachées. Les modifications ultérieures ne sont plus suivies et aucune synchronisation automatique avec la base de données n’a lieu. |
| REMOVE | Une entité supprimée est uniquement planifiée pour suppression. L’instruction DELETE correspondante est exécutée dans la base de données lors de la phase de synchronisation (flush) du contexte de persistance. |

-
UserJPA user = new UserJPA()Lorsqu’on crée une nouvelle en JPA, elle se retrouve dans l’étatNEW -
entityManager.persist(user)Lorsqu’on fait unpersist()sur l’entité, alors elle passe dans l’étatMANAGED. Cela signifie que l’entité est connue par unEntityManager -
entityManager.detach(user)Lorsqu’on détache une entité, nous disons à JPA que l’entité n’est plus managée par JPA mais elle continue néanmoins à garder des informations comme quoi elle est la représentation de quelque chose qui existe en base. Pour re-attacher il faudra utiliser la méthodemerge() -
entityManager.remove(user)Finalement, si nous n’avons plus besoin de cet utilisateur nous allons faire unremove(). Par conséquent, l’entité va être dans l’étatREMOVED. Note, à ce moment l’entité n’est pas supprimé en base il faudra attendre les opérations de commit
Le Persistence Context capture les changements d’état des entités et, lors du flush, les traduit en
instructions SQL. Les interfaces JPA EntityManager et Hibernate Session sont des passerelles vers le
Persistence Context sous-jacent et définissent toutes les opérations de transition d’état des entités.