Diferencia entre save y saveAndFlush en Spring data jpa

131

Estoy tratando de aprender JPA de datos de primavera probando algunas operaciones CRUD a través de JpaRepository.

Encontré dos métodos savey saveAndFlush. No entiendo la diferencia entre estos dos. Al llamar savetambién mis cambios se guardan en la base de datos, ¿de qué sirve saveAndFlush?

Anand
fuente

Respuestas:

139

Activado saveAndFlush, los cambios se enjuagarán a DB inmediatamente en este comando. Con save, esto no es necesariamente cierto, y podría permanecer solo en la memoria, hasta flushocommit comandos se emiten.

Pero tenga en cuenta que incluso si elimina los cambios en la transacción y no los confirma, los cambios aún no serán visibles para las transacciones externas hasta que se confirmen en esta transacción.

En su caso, probablemente utilice algún tipo de mecanismo de transacciones, que emite commitcomandos para usted si todo funciona bien.

usuario1918305
fuente
35
"no será visible para las transacciones externas hasta que se confirme en esta transacción" Depende del nivel de aislamiento de las otras transacciones. Si el nivel de aislamiento de una transacción es READ_UNCOMMITTED, verá lo que se ha vaciado pero otras transacciones aún no han confirmado.
Gab 是 好人
1
pero, en mi proyecto, uso save (), saveAll () y persiste en la base de datos sin comprometer o eliminar llamadas explícitamente. Entonces, ¿por qué debería preferir saveAndFlush? Modo FLush todas esas cosas están en modo predeterminado
P Satish Patro
37

Dependiendo del modo de descarga de hibernación que esté utilizando ( AUTOes el valor predeterminado), savepuede o no escribir sus cambios en la base de datos de inmediato. Cuando llama saveAndFlush, está aplicando la sincronización del estado de su modelo con la base de datos.

Si usa el modo de descarga AUTO y está usando su aplicación para guardar primero y luego seleccionar los datos nuevamente, no verá una diferencia en el comportamiento entre save()y saveAndFlush()porque la selección activa primero una descarga. Ver la documentación .

Ralf
fuente
lo siento pero si soy saveuna entidad y nuevamente la misma, ¿quieres decir que con saveel segundo comando no arrojaré una excepción por duplicación, por ejemplo?
azerafati
3
@Bludream Sí, tengo entendido que las llamadas a saveson idempotentes. Vea este hilo para más detalles.
Ralf