Différence entre save et saveAndFlush dans Spring Data JPA

131

J'essaie d'apprendre les données de printemps JPA en testant certaines opérations CRUD via JpaRepository.

Je suis tombé sur deux méthodes saveet saveAndFlush. Je ne comprends pas la différence entre ces deux. En appelant saveaussi mes modifications sont enregistrées dans la base de données, alors à quoi sert saveAndFlush.

Anand
la source

Réponses:

139

Sur saveAndFlush, les modifications seront immédiatement vidées dans la base de données dans cette commande. Avec save, ce n'est pas nécessairement vrai, et peut rester juste en mémoire, jusqu'à ce que flushou les commitcommandes sont émises.

Mais sachez que même si vous effacez les modifications dans la transaction et ne les validez pas, les modifications ne seront toujours pas visibles pour les transactions extérieures jusqu'à la validation dans cette transaction.

Dans votre cas, vous utilisez probablement une sorte de mécanisme de transactions, qui émet une commitcommande pour vous si tout fonctionne bien.

user1918305
la source
35
"ne sera pas visible pour les transactions extérieures jusqu'à la validation dans cette transaction" Cela dépend du niveau d'isolement des autres transactions. Si le niveau d'isolement d'une transaction est READ_UNCOMMITTED , alors il verra ce qui a été vidé mais pas encore validé par d'autres transactions.
Gab 是 好人
1
mais, dans mon projet, j'utilise save (), saveAll () et cela persiste dans DB sans commit ou flush appelant explicitement. Alors pourquoi devrais-je préférer saveAndFlush? Mode FLush toutes ces choses sont en mode par défaut
P Satish Patro
37

Selon le mode de vidage d'hibernation que vous utilisez (il AUTOs'agit de la valeur par défaut), savevous pouvez ou non écrire vos modifications directement dans la base de données. Lorsque vous appelez, saveAndFlushvous appliquez la synchronisation de l'état de votre modèle avec la base de données.

Si vous utilisez le mode de vidage AUTO et que vous utilisez votre application pour d'abord enregistrer puis sélectionner à nouveau les données, vous ne verrez pas de différence de bahvior entre save()et saveAndFlush()car la sélection déclenche d'abord un vidage . Voir la documentation .

Ralf
la source
désolé mais si je suis saveune entité et encore la même, vous voulez dire que savela deuxième commande ne lancera pas d'exception pour la duplication par exemple ??
azerafati
3
@Bludream Oui, je crois comprendre que les appels à savesont idempotents. Voir ce fil pour plus de détails.
Ralf