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";
}
…
bobmoe
Maio 31, 2010, 2:03pm
#6
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.