Merge em JPA - Não atualiza, insere novo registro!

5 respostas
D

Olá pessoal!

Não estou conseguindo atualizar com o merge. Qdo executa o merge é feita a inserção de um novo registro. Na minha classe DaoPaciente tem o seguinte método:
public void atualizarPaciente(Paciente paciente, Long codigoPaciente) {
        EntityManager dao = Conexao.getEM();
        dao.getTransaction().begin();
        dao.find(Paciente.class, codigoPaciente);
        dao.merge(paciente);
  
        dao.getTransaction().commit();
        dao.close();
    }
A chamada do método acima é feita da seguinte forma:
DaoPaciente daoPac = new DaoPaciente();

        daoPac.atualizarPaciente(paciente, codigoPaciente);

Alguém sabe como resolvo isso?
Obrigada pessoal :-)

5 Respostas

rod

O objeto paciente passado por parametro possui um id válido ou diferente de null?

Uma outra coisa, você não precisa fazer o find para atualizar a entidade.

D

Possui um id válido, é o id do paciente que eu quero atualizar, fiz o system.out.println para verificar isso…

D

Ops, tem algumas coisas que esqueci de falar, minha classe paciente extends pessoa.

Outra coisa tbm o meu Id tanto na minha classe @Entity Pessoa quanto no BD tem o nome de codigoPessoa.

Essas duas coisas não alteram nada, né??

rod

o seu método deveria ser +- assim:

public void atualizarPaciente(Paciente paciente) {  
    EntityManager dao = Conexao.getEM();  
    dao.getTransaction().begin();
    dao.merge(paciente);  
  
    dao.getTransaction().commit();  
    dao.close();  
}

Este objeto paciente deve possuir um id para que o merge saiba qual registro atualizar no banco de dados.

D

Ops, agora com as mudanças, o codigoPessoa ficou null!!
Então comecei a fazer algumas mudanças, e reparei que depende de onde eu coloco o paciente.setCodigoPessoa este volta a ficar null :roll: Não sei pq…

Acabou funcionando ao colocar da seguinte forma:

setDadosPaciente();

        DaoPaciente daoPac = new DaoPaciente(); 
        
        paciente.setCodigoPessoa(codigoPaciente); /*armazenei o código do paciente na variável codigoPaciente logo após a recuperação dos dados de Paciente do BD. E pelos testes a alteração do código do paciente  não ficou null qdo o set foi feito nesse ponto*/
        
        daoPac.atualizarPaciente(paciente); 

        jcbPacientes.removeAllItems();
        preencherJcbPaciente();

Como eu fiz o comentário acima:
/armazenei o código do paciente na variável codigoPaciente logo após a recuperação dos dados de Paciente do BD. E pelos testes a alteração do código do paciente só não ficou null qdo o set foi feito nesse ponto/

[color=red]O estranho é que todos os outros set’s ficaram intactos, não viraram null, apenas com o codigo que aconteceu isso.[/color]

Isso é normal???
Obs.: Na minha classe DaoPaciente, alterei o método assim como vc escreveu…

Obrigada:)

Criado 28 de maio de 2010
Ultima resposta 28 de mai. de 2010
Respostas 5
Participantes 2