Hibernate延迟加载
1、類(lèi)級(jí)別的延遲加載
?1、
?
??是通過(guò)session.load方法實(shí)現(xiàn)的
??
??在映射文件中:
??
???<class name="cn.itcast.hibernate717.lazy.Customer" table="customer" catalog="test" lazy="true">
???
???lazy表示延遲加載
???
?2、?? 當(dāng)映射文件中,class元素的屬性lazy為false時(shí),session.load將不采用延遲加載的策略
???
?3、
?
??Session session = HibernateSessionFactory.getSession();
??Customer customer = (Customer)session.load(Customer.class, 2);//customer是一個(gè)代理對(duì)象
??System.out.println(customer.getId());//加載ID的時(shí)候,是不發(fā)出sql語(yǔ)句的??? 標(biāo)示符
??System.out.println(customer.getName());//加載一般屬性的時(shí)候,發(fā)出sql語(yǔ)句
??session.close();
??
?4、類(lèi)級(jí)別的延遲加載只針對(duì)一般屬性起作用
?
?
?5、當(dāng)獲取一般屬性的值時(shí),才要發(fā)出sql語(yǔ)句去加載這個(gè)值
?
2、屬性級(jí)別的延遲加載? (JPA)
?
3、集合的延遲加載
?lazy???
?
??true??? 在加載集合中的數(shù)據(jù)的時(shí)候,發(fā)出sql語(yǔ)句? Iterator<Orders> iterator = ordersSet.iterator();
??
??
??false?? 在加載類(lèi)級(jí)別的對(duì)象時(shí)就會(huì)發(fā)出sql語(yǔ)句?? Customer customer = (Customer)session.get(Customer.class, 2);
??
????發(fā)出兩條sql語(yǔ)句??
????
??????? 1、查詢customer表
??????? 2、查詢order表
??
??
??extra??? 更進(jìn)一步的延遲加載策略
??
????在執(zhí)行ordersSet.size()時(shí),只會(huì)提取出這個(gè)表中的行數(shù),屬性的值是不提取出來(lái)的
????
????
????
?當(dāng)類(lèi)的延遲加載為true時(shí),并且執(zhí)行的是session.load方法時(shí),這個(gè)時(shí)候,集合的延遲加載設(shè)置成lazy="false"是不起作用的
????
????
4、單端的延遲加載
?在加載多的一方時(shí)怎么樣去加載一的一方:
?
??在many-to-one中,把lazy設(shè)置成false時(shí),
??
??????在得到Order時(shí),就把customer的數(shù)據(jù)也加載出來(lái)了
??????
??????如果lazy設(shè)置成proxy時(shí)
??????
??????在得到order對(duì)象時(shí),是不會(huì)加載customer對(duì)象中的數(shù)據(jù),只有當(dāng)customer執(zhí)行g(shù)et方法時(shí),才要發(fā)出sql語(yǔ)句去加載其屬性
說(shuō)明一點(diǎn):
?發(fā)出sql語(yǔ)句只能在session的環(huán)境下進(jìn)行
?
?
總結(jié):
?1、類(lèi)級(jí)別的延遲加載
?
??在加載一個(gè)對(duì)象的時(shí)候,采取的加載策略
??
??
?2、關(guān)聯(lián)級(jí)別的延遲加載
?
??在加載一個(gè)對(duì)象時(shí),這個(gè)對(duì)象關(guān)聯(lián)的對(duì)象的延遲加載策略
?
?
?
?
?延遲加載是hibernate為了提升性能的一種方式
總結(jié)
以上是生活随笔為你收集整理的Hibernate延迟加载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 厨房8平方,23立方美的顶侧双吸够用吗
- 下一篇: Hibernate三大组成部分