Hibernate可以充分有效的使用批量抓取(批量立即加載和批量延遲加載),也就是說(shuō),如果僅一個(gè)訪問(wèn)代理(或集合),那么Hibernate將不載入其他未實(shí)例化的代理。 批量抓取是延遲查詢抓取的優(yōu)化方案,你可以在兩種批量抓取方案之間進(jìn)行選擇:在類級(jí)別和集合級(jí)別。
一對(duì)多、多對(duì)多(末端為多)的情況:在集合的配置中設(shè)置,以 set 為例,如下所示:
<set name="students" inverse="true" cascade="all" lazy="false" batch-size="2" ><!-- 一對(duì)多的延遲加載設(shè)置 -->
<key>
<column name="TEAMID" length="32" not-null="true" />
</key>
<one-to-many class="edu.dgut.ke.model.Student" />
</set>
一對(duì)一、多對(duì)一(末端為一)的情況:如果要對(duì)末端為一的關(guān)聯(lián)設(shè)置批量加載,要在“一”這端的配置文件中進(jìn)行設(shè)置,比如學(xué)生對(duì)身份證,要實(shí)現(xiàn)對(duì)班級(jí)的批量加載,應(yīng)設(shè)置如下
<class name="edu.dgut.ke.model.Certificate" table="CERTIFICATE" lazy="true" batch-size="10" >
測(cè)試?yán)?/u>
List list = session.createQuery("from Student").list();
HibernateSessionFactory.closeSession();
(Student對(duì)Certificate是采用立即加載策略)
控制臺(tái)輸出
Hibernate: select student0_.ID as ID0_, student0_.cardId as cardId0_, student0_.TEAMID as TEAMID0_, student0_.STUDENTNAME as STUDENTN4_0_ from STUDENT student0_
Hibernate: select certificat0_.ID as ID1_0_, certificat0_.`DESCRIBE` as DESCRIBE2_1_0_ from CERTIFICATE certificat0_ where certificat0_.ID in (?, ?, ?, ?, ?, ?)