Erro: org.hibernate.NonUniqueObjectException

9 respostas
edysnipes

Colegas boa tarde.

Estou com um probleminha em minha aplicação!

Em dado momento o usuário realiza uma solicitação que tem duas partes. Ele Preenche a primeira parte e o sistema salva essas informação no BD. Na tela seguinte aparecem outras informações a serem digitadas pelo usuario e salva posteriormente e eu faço o seguinte:

public String finalizarSolicitacao() {
		
		nrIdentidade = (String)session.get("nrIdentidade");
		
		String descObsercao = solicitacaoPNR.getDescObservacao();
		
		solicitacaoPNR = SolicitacaoPNRDAO.getInstance().pesquisarSolicitacaoPNR(nrIdentidade);
			
		solicitacaoPNR.setDescObservacao(descObsercao);

		if(solicitacaoPNR.getSituacaoSolicitacaoPNR().getIdSituacaoSolicitacaoPNR() == 1) {
			Timestamp dtSolicitacao = new Timestamp(System.currentTimeMillis());
			solicitacaoPNR.setDtSolicitacao(dtSolicitacao);
		}
		
		SituacaoSolicitacaoPNR situacaoSolicitacaoPNR = new SituacaoSolicitacaoPNR();
		situacaoSolicitacaoPNR.setIdSituacaoSolicitacaoPNR(2);
		
		solicitacaoPNR.setSituacaoSolicitacaoPNR(situacaoSolicitacaoPNR);
		
		solicitacaoPNR.setSituacaoSolicitacaoPNR(situacaoSolicitacaoPNR);
		try {
			SolicitacaoPNRDAO.getInstance().save(solicitacaoPNR);
			this.carregarHome();
			addActionMessage("Solicitação finalizada com sucesso!");
			return ActionSupport.NONE;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

Ao executar o método save(solicitacaoPNR) tentando salvar a solicitação com um saveOrUpdate me é retornado o seguinte erro:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.mil.siscop.model.SolicitacaoPNR#1]

O que pode ser isso?

Obrigado!

9 Respostas

R

boa tarde, qual o banco que você está usando? pq uma vez ocorreu este problema comigo então eu usava o postgresql e a bronca era na criação do codigo de um dado objeto. Tive que alterar a sequencia manualmente no banco.

edysnipes

Estou utilizando o MySQL. Mas so contrario da sua situação eu consigo gravar o objeto no banco na primeira parte do formulário. Esse problema acontece quando eu atualizo as informações da solicitação.

Grato!

Mero_Aprendiz

edysnipes:
Estou utilizando o MySQL. Mas so contrario da sua situação eu consigo gravar o objeto no banco na primeira parte do formulário. Esse problema acontece quando eu atualizo as informações da solicitação.
Grato!

Olá.
Dá olha olhadinha para saber se você, ao consultar o objeto para alteração, não fechou a sessão. Ou então, no momento de gravar, está tentando salvar o objeto utilizando uma sessão diferente da que você trouxe o objeto.

[]'s
JL

B

Você tem algum campo no banco que é unique, além do id? Pode ser isso também.

edysnipes

O unico campo unique é o idSolicitacao.
Não estou encerrando nem utilizando outra sessão (Até pq não sei como seria isso).

Valew!

Mero_Aprendiz

edysnipes:
O unico campo unique é o idSolicitacao.
Não estou encerrando nem utilizando outra sessão (Até pq não sei como seria isso).

Valew!

Vixi Maria Gospel!
Bem, posta pra gente o metódo que traz o objeto é o codigo do metódo SolicitacaoPNRDAO.getInstance().save(solicitacaoPNR);

[]'s
JL

edysnipes

Vixi Maria Gospel foi boa!!

Aki eu busco o objeto.

1. public String finalizarSolicitacao() {  
   2.       
   3.     nrIdentidade = (String)session.get("nrIdentidade");  
   4.       
   5.     String descObsercao = solicitacaoPNR.getDescObservacao();  
   6.       
   7.     solicitacaoPNR = SolicitacaoPNRDAO.getInstance().pesquisarSolicitacaoPNR(nrIdentidade);  
   8.           
   9.     solicitacaoPNR.setDescObservacao(descObsercao);  
  10.   
  11.     if(solicitacaoPNR.getSituacaoSolicitacaoPNR().getIdSituacaoSolicitacaoPNR() == 1) {  
  12.         Timestamp dtSolicitacao = new Timestamp(System.currentTimeMillis());  
  13.         solicitacaoPNR.setDtSolicitacao(dtSolicitacao);  
  14.     }  
  15.       
  16.     SituacaoSolicitacaoPNR situacaoSolicitacaoPNR = new SituacaoSolicitacaoPNR();  
  17.     situacaoSolicitacaoPNR.setIdSituacaoSolicitacaoPNR(2);  
  18.       
  19.     solicitacaoPNR.setSituacaoSolicitacaoPNR(situacaoSolicitacaoPNR);  
  20.       
  21.     solicitacaoPNR.setSituacaoSolicitacaoPNR(situacaoSolicitacaoPNR);  
  22.     try {  
  23.         SolicitacaoPNRDAO.getInstance().save(solicitacaoPNR);  
  24.         this.carregarHome();  
  25.         addActionMessage("Solicitação finalizada com sucesso!");  
  26.         return ActionSupport.NONE;  
  27.     } catch (Exception e) {  
  28.         e.printStackTrace();  
  29.     }  
  30.     return null;  
  31. }]

esse é o código que salva!

public void save(T instance){
		try {
			sessao.saveOrUpdate(instance);
			sessao.beginTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			sessao.beginTransaction().rollback();
		}
	}
Mero_Aprendiz

Posta o metódo que você utiliza para consultar, já que está acontecendo o erro ao alterar.

edysnipes

Segue:

[code]

public SolicitacaoPNR pesquisarSolicitacaoPNR(String nrIdentidade) {
try {
String sql = "from SolicitacaoPNR where nr_identidade = ?";
Query query = sessao.createQuery(sql);
query.setString(0, nrIdentidade);
return (SolicitacaoPNR) query.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

[code]

valew!

Criado 29 de abril de 2009
Ultima resposta 29 de abr. de 2009
Respostas 9
Participantes 4