Estou tendo NonUniqueObjectException quando tento dar um saveOrUpdate(object) em um objeto. Sei que isso acontece quando na sessão do hibernate já existe outro objeto com o mesmo id.
Acontece é que sempre abro e fecho a sessão em cada chamada ao banco então não entendo por que isto está acontecendo.
Deixe o controle de conexões ao pool do Hibernate. De qualquer forma, sua dúvida é algo recorrente, já aconteceu comigo… se puder, dê mais detalhes (mapeamento, código, etc.) a respeito do problema para podermos ajudá-lo!
[]'s
Eduardo
kaoe
Ja tive estes problemas por varias coisas diferentes, você manda salvar um objeto depois de ter dado flush na sessão do hibernate, ou você armazenou o objeto na sessão (web) e depois esta tentando usar ele direto para alterar sem reanexar ele na sessão do hibernate, e mais numas 4 situações diferentes destas. Realmente tem algo a ver como o fluxo da sua chamada o ideal é dar mais detalhes com o código.
A
amhfilho
Obrigado esb. Na verdade não estou mexendo com as conexões e sim com as sessions do Hibernate.
A estrutura desta classe é a seguinte: Um Pedido contém vários ItemPedido e cada item contém um Produto.
Está dando a exception em cima do Produto:
lojavirtual.exception.DAOException: org.hibernate.NonUniqueObjectException: a different object with the
same identifier value was already associated with the session:
[lojavirtual.modelo.Produto#19]
A
amhfilho
Acho que achei onde está o problema, só não sei como solucionar.
Antes de gravar o pedido, eu carrego (load) um Cliente do banco. Este cliente possui Pedidos, cada ItemPedido possui um Produto.
Fiz um teste lendo o CLiente com JDBC manual (sem Hibernate) e funcionou, parece que o Produto que carrega com os pedidos do cliente conflita com o novo pedido que estou gravando no banco, que tem o mesmo produto.
Estou anexando o códido de leitura do cliente, vejam que sempre fecho a sessão do Hibernate após a leitura. Não era para o objeto ficar atachado à sessão:
publicClientegetClientePorEmail(Stringemail)throwsDAOException{
Clientecliente=null;Sessionsession=null;try{
session=HibernateSessionProvider.getSession();Queryq=session.createQuery("from Cliente where email=?");email=email==null?"":email;q.setString(0,email);List<Cliente>clientes=q.list();if(clientes.size()>0){
cliente=clientes.get(0);}
returncliente;}catch(HibernateExceptione){
thrownewDAOException(e);}finally{
if(session!=null)HibernateSessionProvider.closeSession(session);}