hibernate核心及常用技術


一、hibernate介紹

1、hibernate概述

  hibernate是輕量級Java EE持久層解決方案,管理java類到數據庫表的映射(ORM:對象關系型數據映射),並提供數據查詢獲取的方法。

2、體系結構

  

  (1)SessionFactory:這是Hibernate的關鍵對象,它是單個數據庫映射關系經過編譯后的內存鏡像,它也是線程安全的。它是生成Session的工廠,本身要應用到ConnectionProvider,該對象可以在進程和集群的級別上,為那些事務之間可以重用的數據提供可選的二級緩存。

      (2)Session:它是應用程序和持久存儲層之間交互操作的一個單線程對象。它也是Hibernate持久化操作的關鍵對象,所有的持久化對象必須在Session的管理下才能夠進行持久化操作。此對象的生存周期很短,其隱藏了JDBC連接,也是Transaction 的工廠。Session對象有一個一級緩存,現實執行Flush之前,所有的持久化操作的數據都在緩存中Session對象處。

      (3)持久化對象:系統創建的POJO實例一旦與特定Session關聯,並對應數據表的指定記錄,那該對象就處於持久化狀態,這一系列的對象都被稱為持久化對象。程序中對持久化對象的修改,都將自動轉換為持久層的修改。持久化對象完全可以是普通的Java Beans/POJO,唯一的特殊性是它們正與Session關聯着。

      (4)瞬態對象和脫管對象:系統進行new關鍵字進行創建的Java 實例,沒有Session 相關聯,此時處於瞬態。瞬態實例可能是在被應用程序實例化后,尚未進行持久化的對象。如果一個曾今持久化過的實例,但因為Session的關閉而轉換為脫管狀態。

      (5)事務(Transaction):代表一次原子操作,它具有數據庫事務的概念。但它通過抽象,將應用程序從底層的具體的JDBC、JTA和CORBA事務中隔離開。在某些情況下,一個Session 之內可能包含多個Transaction對象。雖然事務操作是可選的,但是所有的持久化操作都應該在事務管理下進行,即使是只讀操作。

      (6)連接提供者(ConnectionProvider):它是生成JDBC的連接的工廠,同時具備連接池的作用。他通過抽象將底層的DataSource和DriverManager隔離開。這個對象無需應用程序直接訪問,僅在應用程序需要擴展時使用。

      (7)事務工廠(TransactionFactory):他是生成Transaction對象實例的工廠。該對象也無需應用程序的直接訪問。

Hibernate的核心:

                 

 

     從上圖中,我們可以看出Hibernate六大核心接口,兩個主要配置文件,以及他們直接的關系。Hibernate的所有內容都在這了。那我們從上到下簡單的認識一下,每個接口進行一句話總結。

  1、Configuration接口:負責配置並啟動Hibernate

  2、SessionFactory接口:負責初始化Hibernate

  3、Session接口:負責持久化對象的CRUD操作

  4、Transaction接口:負責事務

  5、Query接口和Criteria接口:負責執行各種數據庫查詢

  注意:Configuration實例是一個啟動期間的對象,一旦SessionFactory創建完成它就被丟棄了。

3、hibernate映射

4、組件屬性映射

5、hibernate關聯映射

  hibernate雙向ManyToMany映射

7、HQL查詢

  hibernate之HQL查詢

8、條件查詢

  hibernate之條件查詢

9、SQL查詢

  hibernate之SQL查詢

10、事務管理

  springmvc+hibernate4事務管理配置

11、緩存機制

  緩存的目的減少代碼與數據庫的交互,從而提高數據庫的訪問性能。hibernate默認總是啟用的session級別的一級緩存(每個session獨有的,當Session 關閉后這個 CACHE 也就沒有了),不需要開發者關心,總是有效的。sessionFactory的二級緩存是全局性的,被應用的所有session共享,默認情況是關閉的,需由程序顯式開啟。一旦應用中開啟二級緩存,session在抓取數據時將先查找一級緩存,再查找二級緩存,只有在二者中都沒有要抓取的數據時,才會查找底層數據庫。

  緩存的 key 是根據 hql 生成的 sql ,再加上參數,分頁等信息

  緩存介紹

1、持久化對象的狀態

  瞬態、持久化、脫管

二、問題

1、sessionFactory注入失敗

報錯信息:No qualifying bean of type 'org.hibernate.SessionFactory' available

解決:在web.xml中添加

<listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>

2、sessionFactory.getCurrentSession()時無法獲得同步事務

報錯信息:[Request processing failed; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread]

解決:在web.xml中添加

  <filter>
    <filter-name>SpringOpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SpringOpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

SpringMVC4+Hibernate4運行報錯Could not obtain transaction-synchronized Session for current thread

【SSH進階之路】Hibernate基本原理(一)


免責聲明!

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



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