Sobes.tech
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.