Toutes les opérations que l'on peut faire sur des entités JPA passent directement ou indirectement par l'
entity manager
. Cet objet est central dans cette API. Ainsi, toute entité JPA persistante possède une référence sur l'
entity manager
qui l'a créée ou qui a permis de la retrouver, et un
entity manager
connaît toutes les entités JPA qu'il gère.
Ces opérations peuvent être invoquées directement par appel à la méthode correspondante sur l'
entity manager
. Elles peuvent aussi être invoquées automatiquement sur les entités en relation d'une entité père. Par exemple, il est possible de propager une opération
PERSIST
d'une entité père vers les entités qu'elle a en relation. Nous verrons ce mécanisme de propagation en détails dans le chapitre suivant.
Il n'est pas possible de mettre en relation une entité gérée par un
entity manager
avec une autre entité appartenant à un autre
entity manager
. En revanche, on peut lier une entité à un autre
entity manager
que celui avec lequel elle a été créée ou lue par une opération
MERGE
.
Toutes les opérations de création, effacement ou modification doivent nécessairement se faire dans une transaction. Une transaction démarre sur appel à la méthode
begin()
de la transaction dans laquelle on se trouve, et est validée sur appel à sa méthode
commit()
. On peut annuler une transaction par appel à sa méthode
rollback()
.
Les spécifications JPA définissent cinq opérations sur une entité :
PERSIST
,
REMOVE
,
REFRESH
,
DETACH
et
MERGE
. Ces opérations correspondent à autant de méthodes sur l'objet
EntityManager
.
Cette opération a pour effet de rendre une entité persistante. Si cette entité est déjà persistante, alors cette opération n'a aucun effet. Rendre une entité persistante consiste à l'écrire en base sur le prochain
commit
de la transaction dans laquelle on se trouve.
L'opération
REMOVE
a pour effet de rendre une entité non persistante. Si cette entité est déjà non persistante, alors cette opération n'a aucun effet. Une entité rendue non persistante sera effacée de la base sur le prochain
commit
de la transaction dans laquelle on se trouve.
L'opération
REFRESH
ne s'applique qu'aux entités persistantes. Si l'entité passée en paramètre n'est pas persistante, alors une exception de type
IllegalArgumentException
est générée.
L'opération
REFRESH
a pour effet de synchroniser l'état d'une entité avec son état en base. Si les champs d'une entité ont été modifiés dans la transaction courante, ces modifications seront donc effacées par cette opération. Si l'entité a été modifiée en base, alors ces modifications seront prises en compte lors d'un
REFRESH
.
Une opération
DETACH
sur une entité persistante a pour effet de la détacher de l'
entity manager
qui la gère. Cette entité persistante ne sera donc pas prise en compte lors du prochain
commit
de la transaction dans laquelle on se trouve.
Une opération
MERGE
sur une entité persistante attache cette entité à l'
entity manager
courant. On utilise cette opération pour associer une entité à un autre
entity manager
que celui qui a été utilisé pour la créer ou la lire.
Un opération
MERGE
sur une entité qui a été effacée (opération
REMOVE
) génère une exception de type
IllegalArgumentException
.