Problemas com o merge do JPA / Hibernate. Não faz update, e sim insert. [RESOLVIDO]

Boa tarde pessoal,

estou com o seguinte probleminha:

eu tenho em meu código um determinado metodo que atualiza minha entidade.


public void upadateTeste(T entidade) {
               
               
               getEntityManager();
               entityManager.getTransaction().begin();
               entityManager.merge(entidade);
               entityManager.getTransaction().commit();                
               entityManager.close();

       }
 

e ao mostrar o código sql gerado pelo hibernate,

ele ao invés de fazer um “UPDATE” … ele está fazendo um INSERT.

alguém saberia me explicar o porquê ?

Amigo, acredito que o merge faz insert e update !

Se vc recupera um registro, altera ele e manda fazer merge, ele atualiza.

Agora se vc nao pesquisa o registro e popula o objeto e manda fazer um merge, ele faz insert.

Abraço.

Porque ele não está no estado ‘managed’, mas sim no ‘detached’. Em outras palavras, ele não está dentro do contexto de persistência, é um objeto que não existe no banco.

poderia me explicar melhor ? vc está dizendo que o hibernate não está enxergando meu objeto de código número 10 por exemplo ?

exemplo, entidade.getCod() … na qual o resultado é 10, o hibernate não está enxergando ela ? está achando que é uma entidade nova ?

Eu tentei fazer de uma outra forma utilizando o update no nativeQuery, porém ele traz o mesmo erro. Saca só:


 public String alterarStatus(Integer codItensPedido){
               final Query query = getEntityManager().createNativeQuery("UPDATE tbsicm_pedidoitens SET nr_atendido = true where cd_id_pedido_itens = "+codItensPedido+"");
               query.executeUpdate();
               return "cadastrar_pedido";
               
       }

esse objeto não tem umais uma ligação com hibernate… imagine q se vc fechou a sessão que ele estava ligado o banco pode ter mudado, portanto o obejto está fora de sincronia com os dados. assim vc deve reconecta-lo a alguma sessão do hibernate.

tente, esse caso, com o método update(…)

Problema resolvido galera. Como nosso amigo acima disse, eu preciso buscar o objeto antes de fazer o update.

neste caso, ficou assim:


public String confirmarRecebimento() {
               if (itensPedido.getCodIdPedidosItens() != null) {
                       itensPedido = itensPedidoImpl.buscarPorId(itensPedido.getCodIdPedidosItens());
                       itensPedido.setNrAtendido(true);
                       itensPedidoImpl.upadateTeste(itensPedido);
               }
               //codIdPedidoItem = itensPedidoImpl.alterarStatusRecebimento(itensPedido.getCodIdPedidosItens());
               return "cadastrar_pedido";
               
       }

Onde, antes eu utilizo “buscarPorId” na qual o hibernate vai fazer um entity.find()

e logo dpois eu faço um “updateTeste”, na qual ele faz um entity.merge().

Obrigado pela atenção e disposição de todos.

abraços.