3
respostas

Duvida sobre lista

Opa boa noite, fiz o curso de jsf faz tempinho já e sempre me ocorreu essa duvida, me lembro rapidamente que no curso o nico ACHO que ele falo sobre lista quando tem um fk dentro de uma outra tabela, por exemplo tenho a minha tabela de cidade, e na tabela cidade tenho uma fk de estado. Correto? Então quando eu faço.

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

No minha variavel estado tenho o meu OneToOne. Aqui que vem a minha duvida, aqui quando eu fazer um select nela.

    @SuppressWarnings("unchecked")
    public List<Cidade> lista() {
        return manager.createQuery("Select c FROM Cidade c").getResultList();
    }

Como pode ver não estou juntando nenhuma tabela no meu select, e por padrão o comportamento não seria aquele eager? Que só faz o select em uma tabela? E o quando ja deixa com o lazzy a minha fk não é carregada quando faço um select apenas em uma tabela? Pois então estou fazendo um select e me deparei no console com o resultado.

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=?

Mesmo com um select está puxando a fk.

3 respostas

O fetch type padrão dos relacionamentos @ManyToOne e @OneToOne é o EAGER, enquanto que para os demais é o Lazy.

Como vc ta projetando o objeto por inteiro "C", todos os atributos simples, e acredito que tb os relacionamentos EAGER também são trazidos.

Faça o teste de trocar o fetch type do relacionamento para Lazy e verifique o console e mostre o resultado.

Uma boa referência para o assunto ... http://www.thoughts-on-java.org/entity-mappings-introduction-jpa-fetchtypes/

Breno fiz a alteração pro tipo lazy e continuou a mesma coisa