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();
Това ще зареди авторите и техните книги с една заявка.