hibernate中configuration和配置文件筆記


  • hibernate的核心類和接口
  1. Configuration類
    1.   作用:(1)讀取hibernate.cfg.xml文件

                   (2)管理對象關系映射文件<mapping resource="">

                   (3)加載hibernate的驅動,例如:url,用戶名

                   (4)管理hibernate配置信息

  2. hibernate.cfg.xml
  3. 對象關系映射文件
  4. SessionFactory(會話工廠)接口
    1. 緩存sql語句和某些數據(稱為Session級緩存)
    2. 在應用程序初始化的時候創建,是一個重量級類(耗內存),一般使用單例模式保證一個應用中只需要一個SessionFactory實例
    3. 在如果某個應用訪問多個數據庫,則要創建多個會話工廠實例,一般是一個數據庫一個會話工廠實例。
    4. 通過SessionFactory接口可以獲得Session(會話)實例。
    5. 示意代碼如下:
      1 1 Configuration cf = new Configuration().configure();
      2 2 SessionFactory sf = cf.buildSessionFactory();
      3 3 Session s = sf.getCurrentSession();//或者是:Session s = sf.openSession();

      注意:這里有關sf.getCurrentSession()和sf.oopenSession()的區別:openSession()是每次可以獲取一個全新的session;getCurrentSession()獲取的是和當前線程綁定的session,即:在同一個線程中我們獲取的session是同一個session,這樣的話可以利於事務的控制。如果是使用getCurrentSessionn(),需要再hibernate.cfg.xml文件中配置如下:

      1 <!--配置可以使用getCurrentSession-->
      2 <property name="hibernate.current_session_context_class">thread</property>

       在使用過程中openSession()和getCurrentSession()的選擇原則:①如果需要在同一個線程中,保證使用同一個Session時,則使用getCurrentSession();②如果在一個線程中,需要使用不同的Session,則使用openSession();

  5. openSession()和getCurrentSession區別:
    1. 采用getCurrentSession()創建的session會綁定到當前線程中,而采用openSession() 創建的session則不會
    2. 采用getCurrentSession()創建的session在commit或rollback時,會自動關閉,而采用openSession()創建的session必須手動關閉。
    3. 使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
      1 <!--如果使用的是本地事務(jdbc事務)配置可以使用getCurrentSession,-->
      2 <property name="hibernate.current_session_context_class">thread</property>
      3 <!-- 如果使用的是全局事務(jta事務)-->
      4 <properity name="hibernate.current_session_context_class">jta</properity>

       

  6. 如何查看session是否及時關閉
    1. windows:
      1. 在cmd命令中輸入:netstat -an [oracle 1521/mysql 3306/sql server 1433]
    2. linux/unix:
      1. 在命令行中輸入:netstat -an 或者top
  7. session接口的主要作用是:
    1. session一個實例代表與數據庫的一次操作(一次操作可以使crud組合)
    2. session實例通過SessionFactory獲取,用完及時關閉
    3. session是線程不同步的(不安全),因此要保證在同一線程中使用,可以用getCurrentSession()獲取
    4. session可以看做是持久化管理器,它是與持久化操作相關的接口
  8. Session(會話)接口的幾個重要方法:
    1. 保存一個對象(記錄)——save方法
    2. 刪除一個對象(記錄)——delete方法
    3. 查詢一個對象(記錄)——get/load方法
      1. get()和load()區別:
        1. get()方法直接返回實體類,如果查不到數據則返回null,load()會返回一個實體代理對象(當前這個對象可以自動轉化為實體對象),當代理對象被調用時,如果沒有數據不存在,就會拋出org.hibernate.ObjectNoFoundException異常
        2. load先到緩存(session緩存/二級緩存)中取查,如果沒有則返回一個代理對象(不馬上到DB中去找),等后面使用這個代理對象操作的時候,才到DB中去查詢,這就是常說的load在默認情況下支持延遲加載(lazy)
        3. get先到緩存(session緩存/二級緩存)中去查,如果沒有就到DB中去查(即馬上發出sql)。總之,如果確定DB中有這個對象就用load(),不確定就用get()(這樣可以提高效率)。
    4. 修改一個對象(記錄)——update方法

           

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM