hql懒加载后判断对象是否存在_hibernate延迟加载(懒加载)详解
延遲加載
一.什么是懶加載?他的作用?
延遲加載,也叫懶加載,它是Hibernate為提高程序執行效率而提供的一種機制,即只有真正使用該對象的數據時才會創建。
Hibernate中主要是通過代理(proxy)機制來實現延遲加載。它的具體過程:Hibernate叢數據庫獲取某一個對象數據時、獲取某一個對象的集合屬性值時,或獲取某一個對象所關聯的另一個對象時,由于沒有使用該對象的數據,hibernate并不是數據庫加載真正的數據,而只是為該對象創建一個代理對象來代表這個對象,這個對象上的所有屬性都是默認值;只有在真正需要使用該對象的數據時才創建這個真實對象,真正從數據庫中加載它的數據,這樣在某些情況下,就可以提高查詢效率。
有如下程序代碼:
User user=(User)session.load(clazz, id);//直接返回的是代理對象
System.out.println(user.getId());//沒有發送sql語句到數據庫加載
user.getName();//創建真實的User實例,并發送sql語句到數據庫中
注意:1.不能判斷User=null;代理對象不可能為空
代理對象的限制:和代理關聯的session對象,如果session關閉后訪問代理則拋異常。session關閉之前訪問數據庫
2.getId()方法不行因為參數為ID,getClass()方法不用訪問數據庫就可以得到的數據
Hibernate中默認采用延遲加載的情況主要有以下幾種
1,當調用session上的load()加載一個實體時,會采用延遲加載。
2,當session加載某個實體時,會對這個實體中的集合屬性值采用延遲加載
3當session加載某個實體時,會對這個實體所有單端關聯的另一個實體對象采用延遲加載。
二.關閉延遲加載
延遲加載確實會給程序的查詢效率帶來好處,但有時明確知道數據需要立即加載,如果Hibernate先默認使用延遲加載,而后又必須去數據庫加載,反而會降低效率
1.???? 加載單個實體,如果不需要延遲加載,就可以使用session的get()方法。
2.???? 當session加載某個實體時,不需要對這個實體中的集合屬性值延遲加載,而是要立即加載。這是可以在映射文件中這個集合的配置元素(set bag list)添加屬性lazy=false;
3.???? 當session加載某個實體時,不需要對這個實體所單端關聯的另一個實體對象延遲加載,就可以在影射文件中針對這個單端關聯的配置元素()添加lazy=false;
三.抓取策略
通過asm和cglib二個包實現;Domain是非final的。
1.session.load懶加載。
2.one-to-one(元素)懶加載:
必需同時滿足下面三個條件時才能實現懶加載
(主表不能有constrained=true,所以主表沒有懶加載)
lazy!=false 2)constrained=true3)fetch=select
3.one-to-many (元素)懶加載:1)lazy!=false 2)fetch=select
4.many-to-one (元素) :1)lazy!=false 2)fetch=select
5.many-to-many (元素) :1)lazy!=false 2)fetch=select
6.能夠懶加載的對象都是被改寫過的代理對象,當相關聯的session沒有關閉時,訪問這些懶加載對象(代理對象)的屬性(getId和getClass除外)hibernate會初始化這些代理,或用Hibernate.initialize(proxy)來初始化代理對象;當相關聯的session關閉后,再訪問懶加載的對象將出現異常。
分享到:
2015-01-24 06:24
瀏覽 975
評論
總結
以上是生活随笔為你收集整理的hql懒加载后判断对象是否存在_hibernate延迟加载(懒加载)详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字典遍历取值_Python中
- 下一篇: 显示行数 设置ssh终端_linux限制