Diferença entre save e saveAndFlush no jpa de dados do Spring


131

Estou tentando aprender dados de primavera JPA testando alguma operação CRUD via JpaRepository.

Me deparei com dois métodos savee saveAndFlush. Eu não entendo a diferença entre esses dois. Ao chamar savetambém minhas alterações estão sendo salvas no banco de dados, então, para que serve saveAndFlush.

Respostas:


139

Ativado saveAndFlush, as alterações serão liberadas para o DB imediatamente neste comando. Com save, isso não é necessariamente verdade e pode permanecer apenas na memória, até que flushou commitcomandos sejam emitidos.

Mas lembre-se de que, mesmo que você limpe as alterações na transação e não as confirme, as alterações ainda não serão visíveis para as transações externas até o commit nessa transação.

No seu caso, você provavelmente usa algum tipo de mecanismo de transações, que emite commitcomandos para você, se tudo der certo.


35
"não ficará visível para as transações externas até o commit nessa transação" Depende do nível de isolamento das outras transações. Se o nível de isolamento de uma transação for READ_UNCOMMITTED ,, ele verá o que foi liberado, mas ainda não confirmado por outras transações.
Gab是好人

1
mas, no meu projeto, eu uso save (), saveAll () e ele persiste no DB sem confirmar ou liberar chamadas explicitamente. Então, por que devo preferir saveAndFlush? Modo de descarga todas essas coisas estão em modo padrão
P Satish Patro

37

Dependendo do modo de liberação de hibernação que você está usando ( AUTOé o padrão), savepode ou não gravar suas alterações no banco de dados imediatamente. Quando você liga, saveAndFlushestá reforçando a sincronização do seu estado de modelo com o banco de dados.

Se você usar o modo de descarga AUTOMÁTICO e estiver usando seu aplicativo para salvar primeiro e depois selecionar os dados novamente, não verá uma diferença de temperatura entre save()e saveAndFlush()porque a seleção aciona uma descarga primeiro. Veja a documentação .


desculpe, mas se eu saveuma entidade e novamente a mesma, você quer dizer com saveo segundo comando não lançará uma exceção para duplicação por exemplo?
Azerafati 5/07

3
@ Bludream Sim, é meu entendimento que as chamadas para savesão idempotentes. Veja este tópico para mais detalhes.
Ralf
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.