Hibernate 之 懶載入

Kunaly發表於2018-03-08

懶載入/延遲載入

1. 延遲載入先獲取到代理物件,當真正使用到該物件中的屬性的時候,才會傳送SQL語句,是Hibernate框架提升效能的方式
2. 類級別的延遲載入
    * Session物件的load方法預設就是延遲載入
    * Customer c = session.load(Customer.class, 1L);沒有傳送SQL語句,當使用該物件的屬性時,才傳送SQL語句

    * 使類級別的延遲載入失效
        * 在<class>標籤上配置lazy=”false”
        * Hibernate.initialize(Object proxy);

3. 關聯級別的延遲載入(查詢某個客戶,當檢視該客戶下的所有聯絡人是是否是延遲載入)
    * 預設是延遲載入
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Customer c = session.get(Customer.class, 1L);
        System.out.println("=============");
        System.out.println(c.getLinkmans().size());
        tr.commit();

技術分析之Hibernate框架的查詢策略

1. 查詢策略:使用Hibernate查詢一個物件的時候,查詢其關聯物件.應該如何查詢.是Hibernate的一種優化手段!!!    
2. Hibernate框架的檢索策略解決的問題
    * 查詢的時機
        Customer c1 = (Customer) session.get(Customer.class, 1);
        System.out.println(c1.getLinkmans().size());

        * lazy屬性解決查詢的時機的問題,需要配置是否採用延遲載入!!

    * 查詢的語句形式
        List<Customer> list = session.createQuery("from Customer").list();
        for(Customer c : list){
            System.out.println(c.getLinkmans());
        }

        * fetch屬性就可以解決查詢語句的形式的問題!!

技術分析之在set標籤上配置策略

1. 在<set>標籤上使用fetch和lazy屬性
    * fetch的取值              -- 控制SQL語句生成的格式
        * select                -- 預設值.傳送查詢語句
        * join                  -- 連線查詢.傳送的是一條迫切左外連線!!!配置了join.lazy就失效了
        * subselect             -- 子查詢.傳送一條子查詢查詢其關聯物件.(需要使用list()方法進行測試)

    * lazy的取值               -- 查詢關聯物件的時候是否採用延遲!
        * true                  -- 預設.延遲
        * false                 -- 不延遲
        * extra                 -- 及其懶惰

2. set標籤上的預設值是fetch="select"和lazy="true"

3. 總結:Hibernate框架都採用了預設值,開發中基本上使用的都是預設值。特殊的情況。

技術分析之在man-to-one標籤上配置策略

1. 在<many-to-one>標籤上使用fetch和lazy屬性
    * fetch的取值      -- 控制SQL的格式.
        * select        -- 預設。傳送基本select語句查詢
        * join          -- 傳送迫切左外連線查詢

    * lazy的取值       -- 控制載入關聯物件是否採用延遲.
        * false         -- 不採用延遲載入.
        * proxy         -- 預設值.代理.現在是否採用延遲.
            * 由另一端的<class>上的lazy確定.如果這端的class上的lazy=”true”.proxy的值就是true(延遲載入).
            * 如果class上lazy=”false”.proxy的值就是false(不採用延遲.)

2. 在<many-to-one>標籤上的預設值是fetch="select"和proxy

相關文章