Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

JPA HIBERNATE

Opa boa tarde, vi a video alua do instrutor e fiquei um pouco confuso, ai fui atras de fórum para complementar o conhecimento sobre JPA com Hibernate, vi em forum que por exemplo uma anotação OneToOne tem como o comportamento EAGER, já o OneToMany ou até mesmo o ManyToMany tem o comportamento LAZY, parece que é bom sempre usar o comportamento Lazy para ("evitar que o hibernate fique acessando o banco desncessariamente") Então pesquisando sobre fui mais a fundo e vi que por exemplo.

Se tiver uma tabela.

public Class Venda {
    //restante dos atributos da classe

    @ManyToMany
    private List<Produto> produtos;
}
public Class Produto {
    //restante dos atributos da classe


    private String nome;

}

Nesse caso tenho um comportamento Lazy correto? Se por exemplo eu fizer uma query.

manager.createQuery("SELECT v FROM Venda v", Venda.class).getResultList();

Aqui com o comportamento Lazy irá retornar apenas a minha venda sem a classe produto?

Vi também nesse caso, usando o Lazy, se eu fizer o meu getProduto algo assim.

List<Venda> vendas = manager.createQuery("SELECT v FROM Venda v", Venda.class).getResultList();

no meu caso se eu fizer o for, acessando o meu venda.getProdutos(), ele irá ficar indo no banco de dados o tomanho n da minha Lista da venda, então quando faço um getAlgumAtributo o lazy fica acessando o meu banco? Ou só faz isso quando acesso uma outra tabela? por exemplo venda.getProdutos(1).getId();

int i = 0;
for (Venda venda : vendas) {
    venda.getProdutos(i).getId();
    i++;
}

Qual seria o verdadeiro comportamento do lazy? Estou certo em afirmar isso? Obrigado.

2 respostas
solução!

Para cada chamado do getProdutos(). ele vai disparar o select sim. Esse é o caso clássico das n+1 queries. O que você pode fazer é planejar a query e usar um fetch join. Outro jeito é usar a annotation @BatchSize do hibernate e dar uma equilibrada no lazy.

Opa maneiro Alberto, a anotação e o join fetch tem o mesmo efeito? Pode me dar um outro conselho? Você tem que trazer uma lista muito grande, pesada para o cliente, oque você usaria? Sei que tem caso e caso, mais nesse caso uma lista grande, usaria JDBC puro ou hibernate mesmo? Vlw