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();

Ин имкон медиҳад, ки муаллифон ва китобҳояшон бо як пурсиш бор карда шаванд.