org.hibernate.NonUniqueObjectException [RESOLVIDO]  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
tralala
JavaBaby

Membro desde: 31/03/2006 17:31:53
Mensagens: 91
Offline

Como é do conhecimento de todos, essa exceção é lançada quando vc
tentar associar 2 instancias da mesma classe e com a mesma PK em uma
mesma Session.

Eu estou utilizando Struts + Hibernate, e utilizando um FilterServlet que abre
e fecha uma Session pra todas as requisições seguindo o OSIV.

O código que esta causando o erro é:


A lançada quando é executado o commit é:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.interativati.sigv.cliente.ClienteConcorrente#1]


Bom se no momento que o JSP termina de ser renderizado o FilterServlet fecha a Session, quando o formulário solicita a execução dessa Action está Session não possui nenhum objeto associado a ela, contúdo só existiria um objeto clienteConcorrente associado a ela.
tralala
JavaBaby

Membro desde: 31/03/2006 17:31:53
Mensagens: 91
Offline

someone please
the_negao
JavaChild
[Avatar]

Membro desde: 06/01/2005 01:58:58
Mensagens: 119
Localização: Feira de Santana - BA
Offline

Pessoal,

Também estou tendo esse erro, mas quando eu faço um UPDATE.
Utilizando Struts + Hibernate + javax.servlet.Filter + MySQL.




O parte do código que indica o erro é:



Toda ajuda é bem vinda!
Agradeço...

® Sérgio Souza ®
tralala
JavaBaby

Membro desde: 31/03/2006 17:31:53
Mensagens: 91
Offline

Sergio,

No seu caso é o seguinte:

Se vc esta tentando dar um update, vc teve de fazer um load() ou get() para o Hibernate fazer o retrieve. Quando executa um save()/update() ele tenta associar o objeto a HS, e certamente este mesmo objeto ou outro com a mesma PK ja esta associada a HS.

exemplificando:

como deve estar:
-> get() objeto
-> inicia transacao
-> altera objeto
-> update() // ERRADO, pq o como a sessao não foi fechada ela ja esta associado, e não precisa de update().
-> manda commitar


correto:
-> get() objeto
-> inicia transacao
-> altera objeto
-> manda commitar

se vc fecha a sessão seria:
-> get() objeto
-> fecha sessao
-> altera objeto
-> inicia transacao
-> update() objeto // isso vai re-associalo a Sessão, nesse caso esta correto pq como sessao foi fechada, não existe outro associado
-> manda commitar
the_negao
JavaChild
[Avatar]

Membro desde: 06/01/2005 01:58:58
Mensagens: 119
Localização: Feira de Santana - BA
Offline

tralala,

Funcionou beleza a sua dica, e bem mais simples do que eu estava implementando!

Como estou usando Filtro, só fiz colocar na Action que dá Update:
O get do objeto Nucleo a ser modificado
Set nos campos a serem modificados e pronto!
O begin e o commit da transação e o close da session é feita pelo Filtro.



Valeu ae pela dica!


® Sérgio Souza ®
tralala
JavaBaby

Membro desde: 31/03/2006 17:31:53
Mensagens: 91
Offline

nads
agora só falta eu resolver o meu objeto-fantasma huaeuhea

mardito!
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

O que é que essa linha faz?


Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
tralala
JavaBaby

Membro desde: 31/03/2006 17:31:53
Mensagens: 91
Offline

Maurício,

Ele percorre o Set clienteConcorrente e remove o objeto passado
via parametro do Set.

tralala
JavaBaby

Membro desde: 31/03/2006 17:31:53
Mensagens: 91
Offline

resolvido modificando:

this.clienteConcorrente.remove(clienteConcorrente);

para

this.clienteConcorrente.remove(cc);


sem mais!
Karlen
HelloWorld

Membro desde: 01/07/2004 10:56:06
Mensagens: 12
Offline

tralala,
estou com o mesmo problema que o seu, porém eu não entendi o método que vc criou: delClienteConcorrente(ClienteConcorrente clienteConcorrente), vc poderia me explicar??
Estou fazendo um método generico então ele está assim:
protected Serializable save(Object obj) throws HibernateEsception{
Transaction t = null;
Session s = null;
try{
s = getSession();
t = beginTransaction(s);
Serializable rtn = save(obj,s);
t.commit();
return rtn;
}catch(HibernateException e){
throw e;
}finally{
closeSession();
}

}

Obrigada, no aguardo
[MSN]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team