[Hibernate] Lazy Loading e relacionamentos * para muitos

7 respostas
C

Olá pessoal,

Em que situações pode haver vantagens em usar lazy loading em relacionamentos 1 para muitos ou muitos para muitos, no Hibernate?

Porque eu irei fazer várias consultas ao banco, uma para cada item da coleção do relacionamento, que eu estiver percorrendo, não?

Valeu!

7 Respostas

_fs

Por isso que, quando sabe que usará os objetos do relacionamento lazy em determinado ponto do sistema, deves fazer a query da seguinte forma:

Criteria c = session.createCriteria( Pessoa.class );
c.setFetchMode( "documentos", FecthMode.JOIN );
c.list();

O método setFetchMode também é encontrado na interface Query.

C

LIPE,

Correto. Então, me corrija se eu estiver errado: Lazy Loading, na prática, se torna INÚTIL em relacionamentos que não sejam de cardinalidade 1 ?

Abdon

O lazy loading não existe para relacionamentos de cardinalidade 1-1, estes ja vem preenchidos automaticamente.

A principal vantagem é so fazer uma pesquisa e se vc precisar desdes atributos, a pesquisa deles ficaram por responsabilidade do hibernate não sua.

select * form pessoa where id = 1;
select * from filho inner join pessoa where pessoa.id = 1;

ou apenas

form pessoa p where p.id = 1
List lista = pessoa.getFilho();
_fs

Não entendo sua dúvida nem sua afirmação cara.

É bem simples: lazy loading serve para não carregar o que não quero carregar! Qual a dificuldade? o.o

C
form pessoa p where p.id = 1
 List lista = pessoa.getFilhos();

Aí é que está a minha dúvida. Quando eu dou um pessoa.getFilhos(), ele carrega todos os filhos, ou ele só vai carregá-los quando eu percorrer a coleção de filhos, carregando UM POR UM?

_fs

Ah, entendi sua dúvida.

Basta ver o sql gerado para esta situação:

Pessoa p = ( Pessoa ) session.get( Pessoa.class, 1 );
// select * from T_PESSOAS where id = 1

// se não utilizar a collection o hibernate não a inicializa
p.getFilhos().size();
// select * from T_FILHOS where ID_PESSOA = 1

Ou seja: não, não carrega um a um.

thigo.san

Olá Pessoal… Estou com um problemão no relacionamento 1xN. O sistema que eu estou fazendo tem o entity principal Agent e o entity ContactAgent. O Agent tem uma lista de ContactAgent, no entity do ContactAgent eu quero que apareça o campo AGENTUID(chave primária do entity Agent). Então no sistema quando eu vou salvar o Agent com seus ContactAgent`s ele salva quase tudo certo. No banco os registros são salvos só que o campo AGENTUID na tabela ContactAgent fica nulo. E eu não acho a solução, encontrei bem poucas pessoas com esse problema. Eu uso como banco de dados, o MySql. Vejam os códigos abaixo:

Agent, parte do código onde tem os relacionamentos…

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	private List<ContactAgent> listContact = new ArrayList<ContactAgent>();

ContactAgent, parte do código onde tem os relacionamentos…

@ManyToOne
	@JoinColumn(name="AGENTUID")
	private Agent agent;

Classe que persist os registros…

Agent entity = new Agent();
entity.setAgentName(data.getAgentName());
entity.setUsuarioUid(usuarioEntity);
entity.setListContact(contactAgentList);
getEm.persist(entity);

Alguém aí já passou por isso?

Criado 17 de maio de 2006
Ultima resposta 5 de jan. de 2008
Respostas 7
Participantes 4