Hibernate como não carregar coleção sempre ao carregar um classe?

9 respostas
P

Pessoal tenho o relacionamento:

<set name="topicos" table="forumTopicos"> <key column="forumId"/> <many-to-many class="br.com.cc.business.model.Topico" column="topicoId"/> </set>

Eu gostaria que o hibernate só carregasse o atributos topicos ondemand, não sempre ao carregar o forum, isto é possivel?

[]'s,
Pablo

9 Respostas

caiofilipini

Marque o relacionamento como lazy:

<set name="topicos" table="forumTopicos" lazy="true"> ... </set>

[]'s

P

certo, eu como eu faria para carregar? a única idéia que me passa pela cabeça e no getter de topicos verificar se ele não foi carregado, caso não chamar o DAO ali mesmo, não achei muito legal, o que vc acha?

_fs

Quando tentar acessar a coleção pela primeira vez a partir de um objeto transiente, a consulta será realizada.

P

Não entendi, você pode dar um exemplo? Pq tem que ser transient?

_fs

Bah usei a palavra errada, não lembro a correta.

Exemplo:

// nesta linha a query gerada seria algo como
// select ID, nome from tPessoas where ID = ?
Pessoa p = ( Pessoa ) session.get( Pessoa.class, id );

// faz outras coisas

// apenas neste instante que ocorre o select do relacionamento
List l = p.getListaEnormeQueFoiDeclaradaComoLazy();
P

Nossa que loco, vou testar, como ele sabe que o metodo getListaLazy, vou invocado para capturar os dados do banco?

_fs

Porque o objeto é [palavra_que_esqueci_o_nome].

Debugue sua aplicação e veja as propriedades de um objeto normal seu (por exemplo Pessoa) depois que ele é retornado pelo Hibernate, e não simplesmente instanciando.
Para esclarecer:

Pessoa p = ( Pessoa ) session.get( Pessoa.class, id );

// é BEM diferente de um simples

Pessoa p = new Pessoa( id, nome, idade );
caiofilipini

Persistente?

_fs

Deve ser :smiley:

Criado 10 de fevereiro de 2005
Ultima resposta 11 de fev. de 2005
Respostas 9
Participantes 3