Sobes.tech
Junior — Middle

Можеш ли да дадеш пример за възникване на проблема N+1 при използване на Hibernate?

sobes.tech AI

Отговор от AI

Проблемът N+1 възниква, когато при зареждане на колекция от свързани същности Hibernate изпълнява един заявка за основната същност (N), а след това отделна заявка за всяка свързана същност (+1 за всяка). Например, има същност Author с колекция books:

List<Author> authors = session.createQuery("from Author").list();
for (Author author : authors) {
    System.out.println(author.getBooks().size()); // При лениво зареждане, за всяка книга ще има отделна заявка
}

Тук първо се изпълнява една заявка за получаване на всички автори, а след това за всеки автор — отделна заявка за зареждане на книгите. Това води до много заявки и намалява производителността.

За да избегнете този проблем, можете да използвате fetch join:

List<Author> authors = session.createQuery("select a from Author a join fetch a.books").list();

Това ще зареди авторите и техните книги с една заявка.