8. Opérations
Update
et
Delete
À première vue, on pourrait se demander à quoi peut bien servir la définition des opérations
update
et
delete
en JPQL, sachant que toute modification d'une entité JPA dans une transaction entraîne une modification de la base, et que l'on dispose d'une méthode
remove()
sur la classe
EntityManager
qui efface un objet.
La réponse tient en un seul mot :
performance
. Il est toujours plus rapide de lancer une requête
delete from Marin
qui efface le contenu d'une table entière que de boucler sur des centaines d'entités qui vont être effacées une par une. Il en va de même pour les mises à jour.
À tel point que la spécification JPA parle de
bulk update
et de
bulk delete
pour ces opérations : il s'agit d'opérations massives, qui n'ont de sens que si elles agissent sur des volumes de données importants.
L'
update
et le
delete
ne peuvent agir que sur une seule classe à la fois. L'opération d'effacement ne se transmet pas aux entités en relation, quelles que soient les stratégies de type
cascade
précisées dans les annotations de ces relations.
Il est à noter que ces opérations agissent directement sur la base, sans tenir compte de la gestion des verrous (verouillage optimiste). La colonne technique qui porte la version de la dernière modification n'est pas gérée par ces opérations. Elle doit donc être gérée à la main. Le cache associé à l'
entity manager
n'est pas mis à jour par ces opérations.
Il faut donc être très prudent lorsque l'on utilise de telles mises à jour ou effacements massifs. Le mieux est de ne faire aucune opération unitaire sur des entités en base, et de réserver la transaction utilisée aux mises à jour massives. Si des opérations unitaires (modification ou effacement d'entités prises une par une) doivent être faites, alors elles doivent l'être avant le lancement des opérations massives d'effacement et de mises à jour.