O que exatamente a estratégia de busca do JPA controla? Não consigo detectar nenhuma diferença entre ansioso e preguiçoso. Em ambos os casos JPA / Hibernate não associa automaticamente relacionamentos muitos para um.
Exemplo: a pessoa possui um único endereço. Um endereço pode pertencer a muitas pessoas. As classes de entidade anotadas JPA se parecem com:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
Se eu usar a consulta JPA:
select p from Person p where ...
JPA / Hibernate gera uma consulta SQL para selecionar na tabela Person e, em seguida, uma consulta de endereço distinta para cada pessoa:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Isso é muito ruim para grandes conjuntos de resultados. Se houver 1000 pessoas ele gera 1001 consultas (1 de Pessoa e 1000 distintas de Endereço). Eu sei disso porque estou olhando o log de consultas do MySQL. Eu entendi que definir o tipo de busca de endereço como ansioso fará com que o JPA / Hibernate consulte automaticamente com uma junção. No entanto, independentemente do tipo de busca, ele ainda gera consultas distintas para relacionamentos.
Somente quando eu digo explicitamente para entrar, ele realmente entra:
select p, a from Person p left join p.address a where ...
Estou faltando alguma coisa aqui? Agora tenho que codificar manualmente cada consulta para que ela se junte aos relacionamentos muitos para um. Estou usando a implementação JPA do Hibernate com MySQL.
Editar: Parece (consulte Hibernate FAQ aqui e aqui ) que FetchType
não afeta as consultas JPA. Portanto, no meu caso, eu disse explicitamente para entrar.