Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Flush e Commit

Olá, não entendi muito bem a diferença do flush e do commit, porque pensando a respeito, o flush mexe com o banco de dados, mas não salva, certo? Então se eu fechar minha aplicação sem dar um commit ( é necessário da um commit dps) eu perco todos os dados. Pensando no lado do commit, da mesma forma eu posso commitar e seguir fazendo alterações e comitando dnv posteriormente, só que sem o perigo que corre o flush de estar no estado detached e dar um exception. Sei que ficou confuso, mas se alguém puder me ajudar, grato desde já.

2 respostas
solução!

Olá, Rodrigo! Entendo que a diferença entre flush e commit possa parecer um pouco confusa, mas vamos tentar esclarecer isso juntos.

Primeiramente, é importante lembrar que o flush e o commit são operações relacionadas à transação do banco de dados, mas têm comportamentos diferentes.

O flush é uma operação que sincroniza o estado atual do EntityManager com o banco de dados. Ou seja, ele executa todas as operações de inserção, atualização e exclusão pendentes no banco de dados, mas sem confirmar a transação. Isso significa que, mesmo após um flush, você ainda pode desfazer as alterações se algo der errado mais tarde na transação. Se você fechar a aplicação após um flush e sem um commit, as alterações não serão salvas no banco de dados.

Por outro lado, o commit é uma operação que confirma a transação. Isso significa que todas as alterações feitas na transação são permanentemente salvas no banco de dados. Após um commit, você não pode desfazer as alterações feitas na transação. Se você fizer alterações após um commit, você precisará iniciar uma nova transação e fazer um novo commit para essas alterações.

Agora, sobre o estado detached, você está correto. Se uma entidade está no estado detached, qualquer alteração feita nela não será automaticamente sincronizada com o banco de dados. Para sincronizar as alterações, você precisará chamar o método merge(), que move a entidade de volta para o estado managed e sincroniza as alterações com o banco de dados.

Aqui está um exemplo prático:

EntityManager em = JPAUtil.getEntityManager();		
em.getTransaction().begin();

em.persist(celulares);
celulares.setNome("XPTO");	

em.flush(); // Aqui, a alteração do nome para "XPTO" é sincronizada com o banco de dados, mas a transação ainda não é confirmada.
em.clear(); // Aqui, todas as entidades são movidas para o estado detached.

celulares = em.merge(celulares); // Aqui, a entidade celulares é movida de volta para o estado managed.
celulares.setNome("1234");
em.flush(); // Aqui, a alteração do nome para "1234" é sincronizada com o banco de dados, mas a transação ainda não é confirmada.

em.getTransaction().commit(); // Aqui, a transação é confirmada e todas as alterações são permanentemente salvas no banco de dados.

Obs: Vale lembrar que o flush() vai depender das configurações do banco de dados e do Hibernate.

Bons estudos!

Obrigado, professor!