[Hibernate] Lazy Loading e relacionamentos * para muitos

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!

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.

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 ?

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();

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

 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?

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.

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?