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.

Anand
fonte

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.

user1918305
fonte
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 .

Ralf
fonte
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