Siempre he pensado cuál podría haber sido la mejor manera de lidiar con este problema en Spring / Hibernate. Imagina que tenemos una entidad como House:

public class House {
    Long id;
    String name;
    String address;
    List<Person> people;
}

Donde Person es otra entidad. Ahora, si queremos mostrar una lista de cada casa que está almacenada, solo queremos algunos detalles, identificación, nombre y dirección, no queremos que se obtengan todos los datos porque no estamos mostrando a las personas en la lista. Sin embargo, cuando ingresamos a una vista detallada, también nos interesa mostrar a las personas.

¿Cuál es la mejor manera de buscar a las personas justo cuando las quieres, cuidando también la LazyInitializationException?

1
Daniel 18 abr. 2020 a las 10:53

2 respuestas

La mejor respuesta

Hay una variedad de opciones. Solo destaco el que uso:

ÚNETE A FETCH

Si necesita cargar a las personas ansiosas, puede crear una consulta como:

select h from House h fetch join people p

Si cree que esto generará muchas consultas, vaya a los gráficos de entidad.

GRÁFICO DE ENTIDAD

Definición:

@Entity
@NamedEntityGraph(name = "graph.House.people", 
      attributeNodes = @NamedAttributeNode("people"))
public class House {

Uso con Spring Data JPA:

@EntityGraph(value = "graph.House.people", type = EntityGraphType.LOAD)
List<House> findById(Long id);

Pero hay más. Lea: https://thoughts-on-java.org/5-ways-to-initialize-lazy-relations-and-when-to-use-them/

1
Simon Martinelli 18 abr. 2020 a las 08:13

Puede usar el gráfico de entidad en el repositorio. Simplemente use @EntityGraph para definir un gráfico de entidad ad-hoc en su método.

@EntityGraph(attributePaths = {"people"})
List<House> findAll();

Aquí, puede definir los atributos que desea obtener como attributePaths. Llame a esto cuando desee mostrar personas; de lo contrario, llame a findAll().

Y también puede usar la recuperación diferida para people, siempre que desee people simplemente llame al que lo obtuvo, entonces JPA buscará automáticamente people en otra consulta.

0
Abinash Ghosh 18 abr. 2020 a las 08:31