1. 程式人生 > >Hibernate學習筆記_02

Hibernate學習筆記_02

提交 dao層 .get cti log www 並且 open cglib

上篇文章(傳送門:Hibernate學習筆記_01)介紹了Hibernate是什麽,如何搭建,配置文件詳解以及Hibernate的一些基本API詳解這幾個方面做了簡單介紹,那麽本文將會從一下5個方面記錄Hibernate的學習經歷:
1.hibernate中的實體規則

2.hibernate中的對象狀態

3.hibernate進階—— 一級緩存

4.hibernate中的事務

5.hibernate中的批量查詢(概述)


Ⅰ.Hibernate中的實體規則

  在Hibernate使用中,需要創建與數據庫表對應的實體,並在映射文件中配置.在創建實體的時候需要註意一些細節.

  (1)實體類創建時需要註意5個事項:

    1.持久化類提供無參數構造

    2.成員變量私有,提供共有get/set方法訪問.需提供屬性

    3.持久化類中的屬性,應盡量使用包裝類型

    4.持久化類需要提供oid.與數據庫中的主鍵列對應

    5.不要用final修飾class(hibernate使用cglib代理生成代理對象.代理對象是繼承被代理對象.如果被final修飾.將無法生成代理.)

  (2)主鍵類型

    自然主鍵(少見):表的業務列中,有某業務列符合,必須有,並且不重復的特征時,該列可以作為主鍵使用.

    代理主鍵(常見):表的業務列中,沒有某業務列符合,必須有,並且不重復的特征時,創建一個沒有業務意義的列作為主鍵.

  (3)主鍵生成策略

    代理主鍵

      identity : 主鍵自增.由數據庫來維護主鍵值.錄入時不需要指定主鍵.

      sequence: Oracle中的主鍵生成策略.

      increment: 主鍵自增.由hibernate來維護.每次插入前會先查詢表中id最大值.+1作為新主鍵值.

      hilo: 高低位算法.主鍵自增.由hibernate來維護.開發時不使用.

      native:hilo+sequence+identity 自動三選一策略.

      uuid: 產生隨機字符串作為主鍵. 主鍵類型必須為string 類型.

    在實際的開發過程中可以根據需要來選擇合適的主鍵生成策略,一般來說比叫常見的是使用native,通常是在實體xxx.hbn.xml中<generator class="native"></generator>屬性中配置

    自然主鍵

      assigned:自然主鍵生成策略. hibernate不會管理主鍵值.由開發人員自己錄入.

Ⅱ.Hibernate中對象的狀態

  在Hibernate中,對象通常分為三種狀態:

    1.瞬時狀態

      沒有id,沒有在session緩存中

 1 public void fun1() {
 2         // 1.獲得session
 3         Session session = HibernateUtils.openSession();
 4         // 2.控制事務
 5         Transaction tx = session.beginTransaction();
 6         // 3.執行操作
 7         Customer c = new Customer(); // 沒有id,沒有在session緩存中 ==> 瞬時狀態
 8 
 9         c.setCust_name("惠普"); // 瞬時狀態
10 
11         session.save(c); // 持久化狀態,有id,在session緩存中
12         // 4.提交事務
13         tx.commit();
14         // 5.關閉資源
15         session.close(); // 遊離|脫管狀態 ,有id,沒有在session緩存中 
16     }

    2.持久化狀態

      有id,在session緩存中

      持久化狀態的特點: 持久化狀態的對象的任何變化都會同步到數據庫當中.

    3.遊離|托管狀態

      有id,沒有在session緩存中

在開發操作過程中,這三種狀態是可以互相轉變的

技術分享圖片

Ⅲ.Hibernate進階——一級緩存

  通常情況下,緩存是為了提高效率,在大家最常見的電腦中,CPU也存在緩存,硬盤也存在緩存,內存中同樣也存在緩存,hibernate中的一級緩存同樣也是為了提高操作數據庫的效率.

  Hibernate中緩存提高效率的手段有兩種:

  1.提高查詢效率

  技術分享圖片

  2.減少不必要的修改語句的發送

  技術分享圖片

Ⅳ.Hibernate中的事務

  大家都知道,事務有四大特性()ACID)分別是:

    原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)

  事務並發帶來的問題有:1.臟讀、2.不可重復讀、3.幻|虛讀。

  事務的隔離級別有四種情況:(後面的數字分別代表上面並發帶來的問題)

    讀未提交- 123

    讀已提交 - 23

    可重復讀(mysql默認級別)-3

    串行化 - 沒有問題

  那麽如何在HIbernate中指定數據庫的隔離級別呢?只要在Hibernate.cfg.xml文件中增加如下一行配置即可

      <!-- 指定Hibernate操作數據庫時的隔離級別 
          ## specify a JDBC isolation level
        #hibernate.connection.isolation 1|2|4|8
        0001 1    讀未提交
        0010 2    讀已提交
        0100 4    可重復讀
        1000 8    串行化
      -->
      <property name="hibernate.connection.isolation">4</property>

  那麽我們在項目中又該如何去管理事務呢?

    業務開始之前打開事務,業務執行之後提交事務. 執行過程中出現異常.回滾事務.

    在dao層操作數據庫需要用到session對象.在service控制事務也是使用session對象完成. 我們要確保dao層和service層使用的使用同一個session對象

    在hibernate中,確保使用同一個session的問題,hibernate已經幫我們解決了. 我們開發人員只需要調用sf.getCurrentSession()方法即可獲得與當前線程綁定的session對象

    註意1: 調用getCurrentSession方法必須配合主配置中的一段配置

    <!-- 指定session與當前線程綁定 -->
    <property name="hibernate.current_session_context_class">thread</property>

    註意2:通過getCurrentSession方法獲得的session對象.當事務提交時,session會自動關閉.不要手動調用close關閉.

    在Service層

    技術分享圖片

    Dao層

    技術分享圖片

Hibernate學習筆記_02