🗑️ 4.5 Testando Alteração e Deleção: O Flush
Até agora, testamos operações simples como inserção e busca. No entanto, quando lidamos com remoção (DELETE) e atualização (UPDATE) via Hibernate, surge um desafio técnico: o atraso na execução (Lazy Execution). O framework muitas vezes acumula as operações em memória e só envia para o banco de dados no final da transação.
🏁 O Problema: Operações “Em Fila”
Se você deletar um usuário e, logo em seguida, fizer um SELECT para garantir que ele sumiu, o teste pode falhar. Isso acontece porque o Hibernate ainda não disparou o comando de deleção real para o banco de dados.
📄 src/test/java/…/repositorio/UsuarioDaoTest.java (O Problema)
@Test
public void deveDeletarUmUsuario() {
Usuario usuario = new Usuario("Maurício", "mauricio@aniche.com.br");
usuarioDao.salvar(usuario);
// Deletando... mas será que o SQL já foi disparado?
usuarioDao.deletar(usuario);
Usuario usuarioNoBanco = usuarioDao.porNomeEEmail("Maurício", "mauricio@aniche.com.br");
// ❌ Pode falhar aqui! O objeto ainda pode estar no banco.
assertNull(usuarioNoBanco);
}🏗️ A Solução: Forçando o Flush
Para garantir que a comunicação ocorreu, devemos forçar o Hibernate a enviar todos os comandos pendentes para o banco através do método flush().
📄 Código Corrigido com Flush
@Test
public void deveDeletarUmUsuarioDeFormaDeterminística() {
Usuario usuario = new Usuario("Maurício", "mauricio@aniche.com.br");
usuarioDao.salvar(usuario);
usuarioDao.deletar(usuario);
// ⚡ Envia todos os INSERTs e DELETEs pendentes para o banco agora!
session.flush();
Usuario usuarioNoBanco = usuarioDao.porNomeEEmail("Maurício", "mauricio@aniche.com.br");
assertNull(usuarioNoBanco);
}
---
## 📊 Ciclo de Vida do Flush
flowchart TD A[“Estado: Transient”] ⇒ B[“session.save() (Memory Queue)”] B ⇒ C[“session.delete() (Memory Queue)”] C ⇒ D{Flush?} D — Sim ⇒ E[“Executa SQL (INSERT/DELETE) no DB ✨”] D — Não ⇒ F[“Aguardando Commit…“] E ⇒ G[🏁 Estado do DB Sincronizado] style E fill:#f1f8e9,stroke:#558b2f,stroke-width:2px
---
> [!IMPORTANT] Quando usar o Flush? 🛡️
>
> Em testes de integração de banco de dados, o `flush()` é o seu melhor aliado para garantir o sincronismo. Use-o sempre que uma operação de escrita (Salvar, Deletar, Atualizar) precisar ser validada por uma leitura subsequente no mesmo teste. 🏁
---
> [!TIP] Dica de Ouro ⚡
>
> Testar métodos de alteração simples (como mudar o nome de um usuário) pode parecer óbvio, mas em entidades ligadas (Leilão com Lances), o teste de alteração garante que o **Cascade** do Hibernate está configurado corretamente. Priorize testes onde há relacionamento entre tabelas. 🚀
---
[[Desenvolvimento de Sistemas/Desenvolvimento de Sistemas II/capitulo_060|⬅️ Capítulo Anterior]] | [[Desenvolvimento de Sistemas/Desenvolvimento de Sistemas II/capitulo_062|Próximo Capítulo ➡️]]