4
respostas

esclarecimento com o fetch.typeLazy vs fetch.typeEager

Opa, bom dia. O eager traz pra gente sua lista e todas suas dependencias correto? o lazy só tras a tabela do select se não usar o join no select ele me retorna apenas a tabela correto? Então eu quero esse mesmo. Mais no meu casa com uma anotação OneToOne ele me está me retornando as 2 tabelas! Oque fazer? porque não quero as 2 tabelas apenas uma!!

 @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @OneToOne(fetch = FetchType.LAZY) // LAZY
    @JoinColumn(name = "estado_codigo")
    private Estado estado = new Estado();
    private Integer codigoMunicipio;
    private String nome;
    private String uf;

Quando faço o select na minha tabela de cidade querendo retornar apenas a minha cidade, no console vem a surpresa!

@SuppressWarnings("unchecked")
    public List<Cidade> lista() {
        return manager.createQuery("Select c FROM Cidade c").getResultList();
    }
Hibernate: select cidade0_.codigo as codigo5_, cidade0_.codigoMunicipio as codigoMu2_5_, cidade0_.estado_codigo as estado5_5_, cidade0_.nome as nome5_, cidade0_.uf as uf5_ from Cidade cidade0_
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?
Hibernate: select estado0_.codigo as codigo2_0_, estado0_.codigoUf as codigoUf2_0_, estado0_.nome as nome2_0_, estado0_.regiao as regiao2_0_, estado0_.uf as uf2_0_ from Estado estado0_ where estado0_.codigo=?

Fazendo o select com a minha tabela de cidade e estado e eu queria apenas a da cidade! Como resolver?

4 respostas

Fala aí Alisson, blz?

O comportamento Lazy só acontece em relacionamentos *ToMany. Em relacionamentos *ToOne sempre temos um Eager.

Espero ter ajudado e bons estudos.

Tente a anotação dessa maneira:

@OneToOne(optional=false, fetch=FetchType.LAZY)

Opa, mais então na relação com final one como fazer para buscar apenas uma tabela?

Alisson, você vai precisar usar a anotação

@LazyToOne(LazyToOneOption.NO_PROXY)

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#annotations-hibernate-lazytoone

Além de configurar a anotação @OneToOne conforme o Bruno indicou.