Hibernate延迟加载
1、類級別的延遲加載
?1、
?
??是通過session.load方法實現的
??
??在映射文件中:
??
???<class name="cn.itcast.hibernate717.lazy.Customer" table="customer" catalog="test" lazy="true">
???
???lazy表示延遲加載
???
?2、?? 當映射文件中,class元素的屬性lazy為false時,session.load將不采用延遲加載的策略
???
?3、
?
??Session session = HibernateSessionFactory.getSession();
??Customer customer = (Customer)session.load(Customer.class, 2);//customer是一個代理對象
??System.out.println(customer.getId());//加載ID的時候,是不發出sql語句的??? 標示符
??System.out.println(customer.getName());//加載一般屬性的時候,發出sql語句
??session.close();
??
?4、類級別的延遲加載只針對一般屬性起作用
?
?
?5、當獲取一般屬性的值時,才要發出sql語句去加載這個值
?
2、屬性級別的延遲加載? (JPA)
?
3、集合的延遲加載
?lazy???
?
??true??? 在加載集合中的數據的時候,發出sql語句? Iterator<Orders> iterator = ordersSet.iterator();
??
??
??false?? 在加載類級別的對象時就會發出sql語句?? Customer customer = (Customer)session.get(Customer.class, 2);
??
????發出兩條sql語句??
????
??????? 1、查詢customer表
??????? 2、查詢order表
??
??
??extra??? 更進一步的延遲加載策略
??
????在執行ordersSet.size()時,只會提取出這個表中的行數,屬性的值是不提取出來的
????
????
????
?當類的延遲加載為true時,并且執行的是session.load方法時,這個時候,集合的延遲加載設置成lazy="false"是不起作用的
????
????
4、單端的延遲加載
?在加載多的一方時怎么樣去加載一的一方:
?
??在many-to-one中,把lazy設置成false時,
??
??????在得到Order時,就把customer的數據也加載出來了
??????
??????如果lazy設置成proxy時
??????
??????在得到order對象時,是不會加載customer對象中的數據,只有當customer執行get方法時,才要發出sql語句去加載其屬性
說明一點:
?發出sql語句只能在session的環境下進行
?
?
總結:
?1、類級別的延遲加載
?
??在加載一個對象的時候,采取的加載策略
??
??
?2、關聯級別的延遲加載
?
??在加載一個對象時,這個對象關聯的對象的延遲加載策略
?
?
?
?
?延遲加載是hibernate為了提升性能的一種方式
總結
以上是生活随笔為你收集整理的Hibernate延迟加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 厨房8平方,23立方美的顶侧双吸够用吗
- 下一篇: 吉普小汽车发动机保养必须做哪些项目呢?