[RESOLVIDO]@FetchMode.JOIN

Boa tarde!

Estou usando hibernate /jpa2, tenho 2 entidades Pessoa e Pessoatelefone, uma pessoa tem varios telefones.

Estou colocando o @FetchMode.JOIN mais mesmo assim o hibernate faz 2 consultas ao inves de uma, o que pode ser?

Valeu.

mapeamento classe Pessoa

    @OneToMany(mappedBy = "pessoa", fetch = FetchType.EAGER, targetEntity = Pessoatelefone.class,
               cascade=CascadeType.ALL, orphanRemoval = true)
    @Fetch(value=FetchMode.JOIN)
    public List<Pessoatelefone> getPessoatelefones() {
        return pessoatelefones;
    }

mapeamento classe Pessoatelefone

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "CODIGOPESSOA", nullable=false)
    public Pessoa getPessoa() {
        return this.pessoa;
    }

hql

       EntityManagerFactory emf = null;
        EntityManager em = null;
        try {
            emf = Persistence.createEntityManagerFactory("teste");
            em = emf.createEntityManager();

            Query q = em.createQuery("FROM Pessoa p WHERE p.codigo = ?1");

            q.setParameter(1, p_Pessoa.getCodigo());

            return (List<Pessoa>)q.getResultList();


            //EntityManagerFactoryImpl empImpl = (EntityManagerFactoryImpl)emf;
            //System.out.println(empImpl.getSessionFactory().getStatistics());


        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (em != null) {
                em.close();
            }
            if (emf != null) {
                emf.close();
            }
            EntityManagerFactoryImpl empImpl = (EntityManagerFactoryImpl) emf;
            System.out.println(empImpl.getSessionFactory().getStatistics());
        }

Tenta mudar isto:

[code]@OneToMany(mappedBy = “pessoa”, fetch = FetchType.EAGER, targetEntity = Pessoatelefone.class,
cascade=CascadeType.ALL, orphanRemoval = true)
@Fetch(value=FetchMode.JOIN)
public List getPessoatelefones() {
return pessoatelefones;
}

Query q = em.createQuery(“FROM Pessoa p WHERE p.codigo = ?1”);

[/code]

por isto:

[code]@OneToMany(mappedBy = “pessoa”, fetch = FetchType.LAZY, targetEntity = Pessoatelefone.class,
cascade=CascadeType.ALL, orphanRemoval = true)
@Fetch(value=FetchMode.JOIN)
public List getPessoatelefones() {
return pessoatelefones;
}

Query q = em.createQuery(“FROM Pessoa p LEFT JOIN FETCH p.pessoatelefone WHERE p.codigo = ?1”);

[/code]

[quote=valfrido.silva]Tenta mudar isto:

[code]@OneToMany(mappedBy = “pessoa”, fetch = FetchType.EAGER, targetEntity = Pessoatelefone.class,
cascade=CascadeType.ALL, orphanRemoval = true)
@Fetch(value=FetchMode.JOIN)
public List getPessoatelefones() {
return pessoatelefones;
}

Query q = em.createQuery(“FROM Pessoa p WHERE p.codigo = ?1”);

[/code]

por isto:

[code]@OneToMany(mappedBy = “pessoa”, fetch = FetchType.LAZY, targetEntity = Pessoatelefone.class,
cascade=CascadeType.ALL, orphanRemoval = true)
@Fetch(value=FetchMode.JOIN)
public List getPessoatelefones() {
return pessoatelefones;
}

Query q = em.createQuery(“FROM Pessoa p LEFT JOIN FETCH p.pessoatelefone WHERE p.codigo = ?1”);

[/code][/quote]

nada parceiro, retorna a seguinte excpetion:

java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: Pessoatelefone of: model.Pessoa [FROM model.Pessoa p LEFT JOIN FETCH p.Pessoatelefone WHERE p.codigo = ?1]

[quote=valfrido.silva]Tenta mudar isto:

[code]@OneToMany(mappedBy = “pessoa”, fetch = FetchType.EAGER, targetEntity = Pessoatelefone.class,
cascade=CascadeType.ALL, orphanRemoval = true)
@Fetch(value=FetchMode.JOIN)
public List getPessoatelefones() {
return pessoatelefones;
}

Query q = em.createQuery(“FROM Pessoa p WHERE p.codigo = ?1”);

[/code]

por isto:

[code]@OneToMany(mappedBy = “pessoa”, fetch = FetchType.LAZY, targetEntity = Pessoatelefone.class,
cascade=CascadeType.ALL, orphanRemoval = true)
@Fetch(value=FetchMode.JOIN)
public List getPessoatelefones() {
return pessoatelefones;
}

Query q = em.createQuery(“FROM Pessoa p LEFT JOIN FETCH p.pessoatelefone WHERE p.codigo = ?1”);

[/code][/quote]

Deu certo parceiro é que eu coloquei p.pessoatelefone e era p.pessoatelefones.

Por acaso vc sabe como eu faço pra funcionar o FETCH.JOIN com criteria?

Valeu.