(十六)Hibernate中的消極式載入

來源:互聯網
上載者:User

標籤:catch   exce   comm   move   close   過程   void   bean   eager   

一、什麼是消極式載入

    為了節省Hibernate載入對象的效能節銷,在Hibernate中真正需要用到這個對象時,才會發出
    
    SQL語句來抓取這個對象。這一個過程稱為消極式載入。

 

二、消極式載入的分類   

    A:實體物件的消極式載入
    
    B:一對多|多對多的消極式載入
    
    C:多對一|一對一的消極式載入
    
    D:屬性的消極式載入

 

  • A:實體物件的消極式載入:使用session.get()和session.load()擷取對象的區別就是是否開啟消極式載入。

Hibernate只載入實體物件的ID,需要其他屬性,才真正的發出SQL來載入這個對象。
    
    Load:採用消極式載入                    載入到的是一個代理對象
    
    Get:沒有採用消極式載入                載入到的是一個實體物件。

  • 案例:

User user=(User)session.load(clazz, id);//直接返回的是代理對象

System.out.println(user.getId());//沒有發送sql語句到資料庫載入

user.getName();//建立真實的User執行個體,並發送sql語句到資料庫中

  • 注意:1.不能判斷User=null;代理對象不可能為空白

      2.代理對象的限制:和代理關聯的session對象,如果session關閉後訪問代理則拋異常。session關閉之前訪問資料庫

 

  • B:一對多|多對多的消極式載入

    fetch = FetchType.Lazy:表示開啟消極式載入。讀取班級時,不會發出讀取學生的SQL語句。等真正使用學生資料時,才會發出一條SQL語句讀取學生
    
    fetch = FetchType.EAGER:取消延遲加裁。讀取班級會左關聯讀取學生。
    
    @OneToMany(cascade = { CascadeType.REMOVE },fetch=FetchType.EAGER)
    @JoinColumn(name = "classes_id")
    @OrderBy(value = " studentID desc")
    public List<StudentBean> getStuList() {
        return stuList;
    }

 

  • C : 多對一|一對一的延遲加裁    預設是取消消極式載入的。
        
        @ManyToOne(fetch=FetchType.LAZY)
        @JoinColumn(name = "group_id")
        private GroupBean groupBean;   

 

 

 

  • 消極式載入帶來的問題: session關閉之後,再訪問代理對象(消極式載入擷取的是代理對象)會拋出“no session”異常。
package action;import java.util.Set;import javassist.compiler.ast.IntConst;import org.hibernate.Session;import org.hibernate.Transaction;import bean.ClassBean;import bean.StudentBean;import util.HibernateSessionUtil;public class Test {    public static void main(String[] args) {        ClassBean cla=Test.load();   //當Test.load()執行完畢之後,session就被關閉,這時候再訪問代理對象則會拋出異常。 使用session。get就不會出現這個問題        System.out.println(cla.getClassName());    }    private static ClassBean load() {        ClassBean cla = null;        Session session = null;        Transaction tran = null;        try {            session = HibernateSessionUtil.getSession();            tran = session.beginTransaction();            cla = (ClassBean) session.load(ClassBean.class, new Integer(2));  //使用消極式載入,獲得的是代理對象            tran.commit();            return cla;        } catch (Exception e) {            e.printStackTrace();            tran.rollback();        } finally {            HibernateSessionUtil.closeSession();  //關閉session        }        return null;    }}
  • 橙色字型處代碼會出現“no session”異常。

 

(十六)Hibernate中的消極式載入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.