Persistência com Hibernate

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. :cool:

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. :cool:

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. :cool:

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. :cool: