- Да,
@BatchSizeе предназначено да се използва с мързеливи асоциации. - Hibernate така или иначе ще изпълни множество оператори в повечето ситуации, дори ако броят на неинициализираните прокси сървъри/колекции е по-малък от посочения размер на пакета. Вижте този отговор за повече подробности. Освен това по-леките заявки в сравнение с по-малко по-големите могат да допринесат положително за общата пропускателна способност на системата.
@BatchSizeна ниво клас означава, че посоченият размер на партидата за обекта ще бъде приложен за всички@*ToOneмързеливи асоциации с този субект. Вижте примера сPersonобект в документацията.
Въпросът/отговорите, които сте предоставили, са по-загрижени за необходимостта от оптимизация и мързеливо зареждане като цяло. Те се прилагат и тук, разбира се, но не са свързани само с пакетно зареждане, което е само един от възможните подходи.
Друго важно нещо е свързано с нетърпеливото зареждане, което е споменато в свързаните отговори и което предполага, че ако даден имот се използва винаги, тогава може да постигнете по-добра производителност, като използвате нетърпеливо зареждане. Това като цяло е не вярно за колекции и в много ситуации за асоциации към едно.
Например, да предположим, че имате следния обект, за който bs и cs савинагит използва се, когато A се използва.
public class A {
@OneToMany
private Collection<B> bs;
@OneToMany
private Collection<C> cs;
}
Нетърпеливо зареждане на bs и cs очевидно страда от N+1 селектира проблем, ако не се присъедините към тях в една заявка. Но ако ги присъедините в една заявка, например като:
select a from A
left join fetch a.bs
left join fetch a.cs
след това създавате пълен декартов продукт между bs и cs и връща count(a.bs) x count(a.cs) редове в резултатния набор за всеки a които се четат един по един и се сглобяват в обектите на A и техните колекции от bs и cs .
Пакетното извличане би било много оптимално в тази ситуация, защото първо ще прочетете A s, след това bs и след това cs , което води до повече заявки, но с много по-малко общо количество данни, които се прехвърлят от базата данни. Освен това отделните заявки са много по-прости от една голяма с обединения и са по-лесни за изпълнение и оптимизиране от базата данни.