¿Qué controla exactamente la estrategia de recuperación de JPA? No puedo detectar ninguna diferencia entre impaciente y vago. En ambos casos, JPA / Hibernate no une automáticamente relaciones de varios a uno.
Ejemplo: la persona tiene una sola dirección. Una dirección puede pertenecer a muchas personas. Las clases de entidad anotadas de JPA se ven así:
@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;
}
Si uso la consulta JPA:
select p from Person p where ...
JPA / Hibernate genera una consulta SQL para seleccionar de la tabla Person, y luego una consulta de dirección distinta para cada persona:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Esto es muy malo para conjuntos de resultados grandes. Si hay 1000 personas, genera 1001 consultas (1 de Persona y 1000 distintas de Dirección). Lo sé porque estoy mirando el registro de consultas de MySQL. Tenía entendido que establecer el tipo de búsqueda de la dirección en ansioso hará que JPA / Hibernate consulte automáticamente con una combinación. Sin embargo, independientemente del tipo de búsqueda, todavía genera consultas distintas para las relaciones.
Solo cuando le digo explícitamente que se una, realmente se une:
select p, a from Person p left join p.address a where ...
¿Me estoy perdiendo de algo? Ahora tengo que codificar manualmente cada consulta para que se una a las relaciones de muchos a uno. Estoy usando la implementación JPA de Hibernate con MySQL.
Editar: Parece (consulte las preguntas frecuentes de Hibernate aquí y aquí ) que FetchType
no afecta las consultas de JPA. Entonces, en mi caso, le he dicho explícitamente que se una.