NonUniqueObjectException em aplicação WEB

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.

Obrigado

amhfilho,

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

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.

Obrigado esb. Na verdade não estou mexendo com as conexões e sim com as sessions do Hibernate.

Este é o código que faz a gravação:

public void save(Pedido pedido) throws DAOException {
        Session session = null;
        try {
            session = HibernateSessionProvider.getSession();
            Transaction t = session.beginTransaction();
            session.saveOrUpdate(pedido);
            t.commit();
            
        } catch (HibernateException e) {
            throw new DAOException(e);
            
        } finally {
            if (session != null) HibernateSessionProvider.closeSession(session);
        }
    }

este é o mapeanto da classe Pedido:

<hibernate-mapping>
    <class name="lojavirtual.modelo.Pedido" table="pedido">
        <id name="id" column="id">
            <generator class="identity"/>
        </id>
        <property name="status" type="java.lang.Integer"/>
        <property name="dataEmissao" type="java.util.Date" column="dt_emissao"/>
        <property name="obs" />
        <many-to-one name="cliente" class="lojavirtual.modelo.Cliente" 
                     column="id_cliente" cascade="all" not-null="true" lazy="false"/>
        
        <bag name="itemsPedido" cascade="all" lazy="false">
            <key column="id_pedido"/>
            <one-to-many class="lojavirtual.modelo.ItemPedido"/>
        </bag>
        
        <many-to-one unique="true" column="id_endereco" name="endereco"
                     class="lojavirtual.modelo.Endereco" cascade="all" lazy="false"/>
        
        <many-to-one unique="true" column="id_frete" name="frete"
                     class="lojavirtual.modelo.Frete" cascade="all" lazy="false"/>            
    </class>
</hibernate-mapping>

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]

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:

public Cliente getClientePorEmail(String email) throws DAOException {
        Cliente cliente = null;
        Session session = null;
        try {
            session = HibernateSessionProvider.getSession();
            Query q = 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);
            }
            
            return cliente;
            
        } catch (HibernateException e) {
            throw new DAOException(e);
            
        } finally {
            if (session != null) HibernateSessionProvider.closeSession(session);
        }