Junior — Middle
Czy możesz podać przykład wystąpienia problemu N+1 podczas korzystania z Hibernate?
sobes.tech AI
Odpowiedź od AI
Problem N+1 pojawia się, gdy podczas ładowania kolekcji powiązanych encji Hibernate wykonuje jedno zapytanie dla głównej encji (N), a następnie osobne zapytanie dla każdej powiązanej encji (+1 dla każdej). Na przykład, istnieje encja Author z kolekcją books:
List<Author> authors = session.createQuery("from Author").list();
for (Author author : authors) {
System.out.println(author.getBooks().size()); // Przy leniwym ładowaniu, dla każdej książki wykonywane jest osobne zapytanie
}
Tutaj najpierw wykonywane jest jedno zapytanie, aby pobrać wszystkich autorów, a następnie dla każdego autora osobne zapytanie do załadowania książek. To prowadzi do wielu zapytań i obniża wydajność.
Aby tego uniknąć, można użyć fetch join:
List<Author> authors = session.createQuery("select a from Author a join fetch a.books").list();
To pozwoli na załadowanie autorów i ich książek jednym zapytaniem.