Duplicidade de registros ao forçar busca

10 respostas
DenisFerro

Olá,

Estamos desenvolvendo um software em ambiente gerenciado pelo glassfish 3 e enfrentando um problema de duplicidade de registros.

@Entity
@Table(name=“cliente”)
public class Cliente implements Serializable { …

@OneToMany(mappedBy=cliente, cascade=CascadeType.ALL, orphanRemoval=true)

private Collection telefones;


Considerando o mapeamento acima, ao forçar o carregamento dos objetos de telefone associados ao cliente pela primeira vez, a consulta é realizada corretamente e exibe normalmente os registros. Porém ao alterar ou deletar um registro, ao realizar novamente a consulta, ela retorna todos os registros duplicados.

No banco não estão sendo gravados registros duplicados, ele apenas duplica ao realizar a consulta. Derrubando o glassfish e subindo novamente, o problema é resolvido, até alterar ou deletar um dado novamente.

Alguém tem alguma ideia do que pode estar acontecendo?

Obrigado.

Denis

10 Respostas

Hebert_Coelho

Como você está trazendo essa coleção do DB? Por consulta?

DenisFerro

Forçando pelo metodo get que é uma coleção do tipo IndirectList, a qual força a consulta das dependencias de cliente…

Note que a entidade está dentro de um ambiente gerenciado, ou seja, um contexto de persistencia.

Tem alguma ideia?

Valeu!

Hebert_Coelho

É cara, bizarro isso.

Veja qual o SQL ele está gerando nessa consulta. Talvez a consulta gerada está incorreto devido ao mapeamento do DB.

lele_vader

Como você está fazendo a sua consulta ?

Hebert_Coelho

lele_vader:
Como você está fazendo a sua consulta ?
Ele não está fazendo por consulta, mas sim por get(). :wink:

DenisFerro
public Comanda atualizarComanda(Comanda comanda)
    {
        comanda = em.merge(comanda);
        
        return comanda;
    }

O metodo acima é executado para atualizar as informações do objeto.

E logo após é chamado o metodo abaixo:

private void carregarComanda(Comanda comanda)
    {
        ArrayList<AgendamentoDeServicoDaComanda> agendamentosDeServicoDaComanda = new ArrayList(comanda.getAgendamentosDeServicosDaComanda());
        this.carregarAgendamentosDeServicoDaComanda(agendamentosDeServicoDaComanda);
        comanda.setAgendamentosDeServicosDaComanda(agendamentosDeServicoDaComanda);
        
        ArrayList<ProdutoDaComanda> produtosDaComanda = new ArrayList(new ArrayList(comanda.getProdutosDaComanda()));
        this.carregarProdutosDaComanda(produtosDaComanda);
        comanda.setProdutosDaComanda(produtosDaComanda);
        
        ArrayList<Pacote> pacotes = new ArrayList(comanda.getPacotes());
        this.carregarPacotes(pacotes);
        comanda.setPacotes(pacotes);
        
        comanda.setAjustesDeDepartamentoDaComanda(new ArrayList(comanda.getAjustesDeDepartamentoDaComanda()));
    }

Na linha 3, em "new ArrayList(comanda.getAgendamentosDeServicosDaComanda())" é onde estamos forçando o carregamento e onde a lista está sendo duplicada.

O metodo carregarComanda() tem por objetivo forçar o mapeamento das dependecias por demanda.

Tentei dar um clear na lista antes de chamar novamente e também não adiantou...

Obrigado.

Hebert_Coelho

Tente limpar o entityManager através do flush/clear.

Bizarro. O.o

Eu sei que se você trocar de Collection por Set funciona, mas não é o desejável né?? :wink:

DenisFerro

jakefrog:
Tente limpar o entityManager através do flush/clear.

Bizarro. O.o

Eu sei que se você trocar de Collection por Set funciona, mas não é o desejável né?? ;)

Flush/clear não funcionou também…

Totalmente bizarro, né?

DenisFerro
Query query = em.createQuery("select c from Comanda c"
                                    + "\nwhere c.id = :pId");
        query.setParameter("pId", comandaId);
        
        Comanda comanda = (Comanda) query.getSingleResult();

        em.refresh(comanda);

Depois de realizar a consulta, colocamos um entityManager.refresh() e o problema parece que foi resolvido.

Não sei se isso é o melhor caminho, porém até agora foi a unica solução...

Com essa solução, alguém consegue ter uma ideia melhor do problema que aconteceu e uma suposta melhor solução?

Muito obrigado pelas respostas!

Hebert_Coelho

Pq vc já não faz essa consulta com join fetch?

Criado 18 de junho de 2012
Ultima resposta 18 de jun. de 2012
Respostas 10
Participantes 3