Galera Bom Dia.
Aqui na empresa onde trabalho estamos desenvolvendo um sistema web cuja camada de persistência é feita utilizando-se Hibernate 3, navegando no sistema percebemos que estavam sendo geradas varias querys SQL para o que séria um consutla simples, pesquisando na internet descobri que isto estava acontecendo porque tinha colocado o atributo fetch setado para EAGER (Estou usando annotations), removi o atributo fetch e deixei o padrão LAZY.
Só que desta forma eu necessito sobrescrever as lazy collections e lazy associations no HQL ou usando a API quando há a necessidade, e esta ai o problema.
Suponhamos que eu tenha um objeto A que possui três coleções: CA, CB, CC em alguns métodos da classe de negócio ou mesmo na view eu preciso apenas dos dados da coleção CA em outros preciso dos dados da CA e CB e em alguns apenas do objeto A, a minha dúvida é: Crio um método na persistência para cada necesidade? visto que é praticamente inviavel eu carregar as coleções onde não é necessário, porque elas podem ter milhares de registros.
Grato, JOhn.
Nesse exemplo q vc deu de um objeto q tem 3 coleções, digamos q não eh uma consulta tão simples assim…
conforme o q vc mapeou, o Hibernate executa a consulta da forma como ele interpretar como mais eficiente…para esse numero q operações nao te dar problema, vc tem q utilizar um pool de conexões…
no mapeamento de Collections vc tem q tomar muiot cuidado realmente, pois vc pode levantar o seu banco inteiro na memoria com uma unica consulta, e nesse ponto q a galera q nao configurou o hibernate muito bem, fala q ele deixa o sistema lento…o lance eh vc analisar os seus relacionamento e ver e qual situação vc quer q a coleção seja inicializada automaticamente…nos casos q a coleção soh eh inicializada de acordo com determinada regra do seu negocio, vc faz o load() da sua classe normalmente e depois vc pode inicializar a coleção manualmente…se eu não me engano eh com Hibernate.initialize(seuObjeto.getSuaCollection);
baum…
espero ter ajudado…
Olá Pedro, Obrigado por responder.
Acredito que se eu adicionar um método na minha classe mais genérica da camada de persistência e implementando o mesmo nos DAO’s eu possa chama-lo de dentro da minha camada de negócio passando como parametro a coleção que eu desejo que seja carregada.
O problema é como que eu faço para ligar o objeto que veio da classe de negócio com a nova sessão que eu vou utilizar para carregar a coleção?
Você/Alguem já implementou algo parecido?
Grato, JOhn.
de qual sessão vc esta falando?
cara, a colection q vc vai inicializar eh a q esta dentro do seu objeto…entao o hibernate sabe q aquilo eh o seu relacionamento, por isso existe o mapeamento, vc nao precisa “ligar” uma coisa com a outra…
mas o lance eh o seguinte…vc deve ter um metodo q utiliza o load() do hibernate certo? pois entao, vc ira criar um outro metodo no seu DAO, um metodo q faz o load() da classe q esta do lado 1 do relacionamento, e logo depois vc inicializa a coleção do lado N do relacionamento…
espero ter ajudado…
flw
Você está falando para colocar o Hibernate.initialize dentro do método que carrega o meu objeto? E por que eu faria isso ao invez de usar os métodos da API ou HQL?
Grato, JOhn.
vc vai manda o Hibernate inicalizar a coleção q esta dentro do objeto q vc acabou de fazer o load(), sacou?
nao precisa de HQL nesse caso…e de qual API vc esta falando? quem vai no banco pra vc eh o Hibernate, por isso vc vai mandar ele inicializar a coleção…
tendeu?
Você esta dizendo para fazer:
session.beginTransaction();
A a = (A) session.get( className, id );
Hibernate.initialize(a);
session.getTransaction().commit();
e eu estou dizendo: que se for para mim fazer isso eu já faço assim:
session.beginTransaction();
Query query = session.createQuery("from A inner join fetch a.CA ");
A a = (A) query.uniqueResult();
session.getTransaction().commit();
entendeu? essa solução é inviavel já que eu vou ter que ficar criando métodos que inicializam esta coleção e outro que inicializa aquela. Ao inves disso eu quero criar um método Genetico que receba qual é a coleção que eu quero criar e inicialize ela para mim.
Grato, JOhn.