Atualizar objeto com hibernate

Estou com dificuldades em atualizar um objeto com hibernate. O seguinte JSON representa um Agendamento meu objeto que ainda não existe no banco. Porém paciente e dentista já existem no banco, por isso eles têm id.

{
	"paciente":{
		"id":1,
		"nome": "Ramires Moreia",
		"idade": 22
	},
	"dentista":{
		"id": 2,
		"crm" : "123-34",
		"nome": "Edilaine Santiago"
	},
	"horario":{
		"hora":7,
		"minuto":30,
		"diaDaSemana": "Segunda-Feira"
	},
	"observacao":"dor no dente"
}

Estou fazendo assim: Leia os comentário são auto explicativos


public class AgendamentoController {

	public static String agendar(Request req, Response resp) {
		//tranformo o JSON no objeto agendamento
		Agendamento agendamento = new Gson().fromJson(req.body(), Agendamento.class);
		
		EntityManager manager = new JPAUtil().getEntityManager();
		manager.getTransaction().begin();
		//busco o Dentista pelo ID
		Dentista dentista = manager.find(Dentista.class, agendamento.getDentista().getId());
		
		//tento adcionar o agendamento na agenda do dentista 
		//é aqui que a exceção é lançada 
		dentista.getAgenda().addAgendamento(agendamento);
		
		manager.getTransaction().commit();

		return "impllementando";
	}

}
}

O Erro que eu recebo é:

javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [br.edu.ifce.odonto.model.Dentista#2]

Com a ajuda da galera do grupo no whapssap eu consegui resolver. A solução está logo abaixo.

Explicação
O correto a ser feito é atualizar o objeto que já esta completo, no meu caso o Dentista e depois eu faço um merge, que atualiza meu objeto no banco de dados.

public class AgendamentoController {

	public static String agendar(Request req, Response resp) {
		Agendamento agendamento = new Gson().fromJson(req.body(), Agendamento.class);
		
		EntityManager manager = new JPAUtil().getEntityManager();
		manager.getTransaction().begin();
		
		Dentista dentista = agendamento.getDentista();	
		dentista.getAgenda().addAgendamento(agendamento);
		manager.merge(dentista);
		
		manager.getTransaction().commit();

		return "impllementando";
	}

}


1 curtida