🗑️ 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 ➡️]]