Criteria trazendo resultados duplicados

[quote=ffoliveira]Novamente no tópico…
Ajustei as classes e os mapeamentos para usar o fetch = FetchType.LAZY
porem o hibernate esta retornando uma exception,

failed to lazily initialize a collection of role

Do que se trata esta erro, e como faço para resolve-lo? [/quote]

Mas você não usou o setFetchMode desejado + DISTINCT_ROOT_ENTITY na sua consulta Criteria?

Exemplo:

        c.setFetchMode("pessoa", FetchMode.JOIN);
        c.setFetchMode("pessoa.fisica", FetchMode.JOIN);
        c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Assim você controla quando quer fazer o join para gerar um único SQL sem precisar cravar isso no mapeamento (o que faria degradar perfomance quando precisar acessar só atributos simples).

Mas mesmo assim terá outros casos em que precisará acessar o atributo sob demanda e vai dar mesmo esse erro que mostrou, para não ocorrer uma das soluções é deixar a conexão (session) aberta durante todo o request, que é a solução que uso. Aqui você fica sabendo mais sobre isso: http://uaihebert.com/?p=1367&page=5

Opa valeu javaflex, seguinte consegui resolver a parada do fetch.LAZY, isto estava me tirando o sono.
A solução do tópico me levou a pensar no que fazer no meu caso, (que é uma aplicação desktop).

       try{
        this.setSession(HibernateUtil.getSessionFactory().getCurrentSession());
        ts = getSession().beginTransaction();
        String hql = "from PessoaJuridica r where r.cnpj = :CNPJ";
        Query consulta = this.getSession().createQuery(hql);
	consulta.setString("CNPJ",pessoa.getCnpj());
        pessoa.setTelefones(new ArrayList<Telefone>());
        pessoa.setEmail(new ArrayList<Email>());
        
        pessoa =(PessoaJuridica) consulta.uniqueResult();
         //Inicializo as coleçoes(E partindo deste ponto posso até fecha-la)
        Hibernate.initialize(pessoa.getTelefones());
        Hibernate.initialize(pessoa.getEmail());
	return pessoa;
    }catch(HibernateException e){
        JOptionPane.showMessageDialog(null, e.getMessage());
        return null;
    }finally{
        try{
         if(    
          this.getSession().isOpen()){
             this.session.close();
         }   
        }catch(Throwable e){
            
        }