Galera,
Estava lendo o livro de EJB 3 e na parte de JPA surgiu algumas dúvidas.
Vou postar alguns exemplos, o código está cheio de “marreta”, pois é só pra teste, para que eu não precise mostrar códigos de outras camadas.
Os trechos de código abaixo são executados dentro de métodos EJB gerenciados pelo container, todos eles com transação REQUIRED.
1 - O método flush força o banco de dados a ser atualizado conforme dados da entidade gerenciada.
Cliente clienteAlterar = entityManager.find(Cliente.class, cliente.getId());
clienteAlterar.setAltura(185);
entityManager.merge(clienteAlterar);
entityManager.flush();
System.out.println(); // breakpoint aqui.
1.1 - Depois de executar o método flush, o mesmo deveria ser forçado a persistir no banco?
Porque nesse caso a transação ainda
não terminou.
Fazendo os testes ao chegar no breakpoint fui na base e conferi os dados e a altura do cliente ainda não havia sido
atualizada, isso ocorreu só depois do término do método, uma vez que a transação foi finalizada.
1.2 - Então o flush nesse cenário não serviu de nada?
2 - O método refresh força a entidade gerenciada a ser atualizada com os dados do banco.
Cliente clienteAlterar = entityManager.find(Cliente.class, 1);
System.out.println(); // breakpoint aqui.
entityManager.refresh(clienteAlterar);
O que fiz para testar:
Quando o código parou no breakpoint, fui na base alterei uma informação do registro de código 1 (referente ao que acabei de pesquisar).
Ao chamar o método refresh esperava que a minha entidade estivesse atualizada, porém isso não aconteceu, o console até mostra
a instrução select, porém não refletiu na entidade gerenciada.
Alguém sabe porque?
vlw galera.