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();
Ин имкон медиҳад, ки муаллифон ва китобҳояшон бо як пурсиш бор карда шаванд.