天天看點

了解Hibernate架構

一、hibernate的工作原理

了解Hibernate架構

上面的執行過程圖已經很清晰的闡釋了hibernate的運作過程:首先,應用程式先調用Configration類,該類讀取hibernate的配置檔案及映射檔案中的資訊(如果我們使用注解的話則不需要讀取映射檔案),并使用這些資訊生成一個SessionFactory對象。接着,從SessionFacctory生成一個Session對象,并用Session對象生成Transaction對象。通過Session對象的get()、sava()、update()、delete()和saveOrupdate()等方法對PO進行加載,儲存,更新,删除等操作;在查詢的情況下,可通過Session對象生成一個Query對象,然後利用Query對象執行查詢操作。如果沒有異常,Transaction對象将送出這些操作結果到資料庫中,否則會復原事務。

hibernate.cfg.xml配置檔案:

  1. <span style="font-size:14px;"><!DOCTYPE hibernate-configuration PUBLIC    
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"    
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    
  4. <hibernate-configuration>    
  5.     <session-factory>    
  6.         <!-- 設定資料庫驅動 -->    
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>    
  8.         <!-- 設定資料庫URL -->    
  9.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>    
  10.         <!-- 資料庫使用者名 -->    
  11.         <property name="hibernate.connection.username">root</property>    
  12.         <!-- 資料庫密碼 -->    
  13.         <property name="hibernate.connection.password">123456</property>    
  14.         <!-- 指定對應資料庫的方言,hibernate為了更好适配各種關系資料庫,針對每種資料庫都指定了一個方言dialect -->    
  15.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>    
  16.     <!-- 列印sql語句,友善調試 -->  
  17.         <property name="show_sql">true</property>  
  18.     <!-- 格式化sql語句,排版 -->  
  19.     <property name="foramt_sql">true</property>  
  20.     <!-- 指定hibernate生成資料庫表的方式:create每次建立新表,update使用原表 -->  
  21.     <property name="hbm2ddl.auto">update</property>  
  22.     <!-- 使用session.getCurrentSession時需要打開該配置 -->  
  23.     <property name="hibernate.current_session_context_class">true</property>  
  24.         <!-- 映射檔案 -->    
  25.         <mapping resource="com/pechen/hibernate/User.hbm.xml"/>    
  26.     </session-factory>    
  27. </hibernate-configuration>  </span>  

*.hbm.xml映射檔案: [java]  view plain  copy

  1. <span style="font-size:14px;"><?xml version="1.0"?>    
  2. <!DOCTYPE hibernate-mapping PUBLIC     
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
  5. <hibernate-mapping>    
  6.     <!--生成預設為user的資料庫表-->    
  7.     <class name="com.pechen.hibernate.User">    
  8.         <id name="id">    
  9.             <!-- 算法的核心思想是結合機器的網卡、當地時間、一個随機數來生成GUID -->    
  10.             <generator class="uuid"></generator>    
  11.         </id>    
  12.         <property name="name"></property>    
  13.         <property name="password"></property>    
  14.         <property name="createTime" type="date"></property>    
  15.         <property name="expireTime" type="date"></property>    
  16.     </class>    
  17. </hibernate-mapping></span>  

hibernate概述

   1、好處

        (1)封裝簡化資料庫代碼

        (2)簡化DAO層的編碼工作

        (3)性能好,靈活,支援各種關系資料庫

   2、工作流程

        (1)Configuration configuration = new Configuration().configure()

         加載hibernate.cfg.xml

        (2)SessionFactory sessionFactory = configuration.buildSessionFactory()

                讀取配置檔案參數(JDBC連接配接、資料庫方言、hbm加載)

        (3)Session session = sessionFactory.getSession()

                從連接配接池中擷取一個連接配接,并建立session對象

        (4)Transaction transaction = session.beginTransaction()

                開啟事務

        (5)資料操作

        (6)transaction.commit()

送出事務

(7)close.session()

關閉會話

(8)sessionFactory.close()

關閉連接配接池

   3、hibernate對象的三種狀态

了解Hibernate架構
(1)瞬時态(transient)

               通過new建立對象,與資料庫沒有關聯,調用save()、saveOrUpdate()、persist()、get()、load()變為持久态

(2)持久态(persistent)

與session關聯,有資料庫辨別,調用delete()變為瞬時态,調用evict()、close()、clear()變為遊離态

(3)遊離态(detached)

                脫離session管理,無法保證與資料庫的一緻性,調用update()、saveOrUpdate()、merge()、lock()變為持久态,調 用delete()變為瞬時态

   4、五個核心接口

        (1)Configuration

配置hibernate,建立sessionFactory對象

(2)SessionFactory

初始化hibernate,建立session對象,線程安全的,重量級,二級緩存

(3)Session

資料庫操作,縣城不安全的,輕量級,一級緩存

(4)Transaction

管理事務

(5)Query和Criteria

執行資料庫查詢

   5、三種檢索政策

(1)立即檢索

将被檢索的對象及其關聯對象加載,如get()

優點:頻繁使用的關聯對象能被加載到緩存

缺點:占記憶體,select語句太多

(2)延遲檢索

第一次使用關聯對象時才加載,如load()

優點:select語句減少,提高性能,節省記憶體空間

缺點:session關閉後,無法通路關聯類對象

(3)左外連接配接檢索

優點:select語句減少,友善應用程式尋找關聯對象

缺點:複雜的資料關系導緻性能下降,可能會加載不需要的對象占用記憶體

   6、三種查詢方式

native sql、hql、criteria

二、常用方法差別總結

   1、save()、saveOrUpdate()、persist()

        save() 更新

        saveOrUpdate() 有主鍵就更新,沒主鍵就插入

persist() 不保證插入,有可能推遲到flush()

   2、insert()、merge()

insert() 插入

merge() 如果設定了資料庫中沒有的ID,執行insert(),如果設定了資料庫中有的ID,執行update()

三、hibernate緩存機制

   1、一級緩存

session級别,預設開啟,當session關閉時,自動釋放一級緩存

   2、二級緩存

sessionFactory級别,預設不開啟

四、hibernate并發機制

   1、什麼是并發

當資料沒有鎖定且多個使用者的事務同時對一個資料庫進行操作,有可能發生資料的不一緻,或其他一些問題

   2、可能帶來的問題

(1)第一類丢失更新

前者的事務執行更新,而後者的事務由于執行失敗引起事務復原,造成前者的執行結果同時丢失

(2)髒讀

後者的事務查詢到前者事務送出前的資料

(3)虛讀

在同一事務執行兩次查詢的過程中,有另一事務對資料進行了增删,造成了查詢結果不一緻

(4)不可重複讀

在同一事務執行兩次查詢的過程中,有另一事務對資料進行了更新,造成了查詢結果不一緻

(5)第二類丢失更新

兩事務同時進行寫操作,後者事務的執行結果覆寫了前者事務的執行結果

   3、四種事務隔離級别

了解Hibernate架構

(1)串行化(Serializable)

(2)可重複讀(Repeatable)

(3)可讀已送出(Read Committed)

常用

(4)可讀未送出(Read Uncommitted)

   4、樂觀鎖和悲觀鎖

(1)樂觀鎖

為資料庫表添加版本号或時間戳,以此識别是否為過期資料

(2)悲觀鎖

為資料加鎖,隻有在事務送出時才會釋放鎖,使資料持久化

五、其他問題

    1、異常分析

        (1)在tomcat 啟動時報錯

                Disabling contextual LOB creation as createClob() method threw error:java.lang.reflect.Invocation

                這是由于hibernate預設用jdbc連接配接資料庫,如果配置了連接配接池,需要修改相關配置。

                以整合後的ssh為例,你隻需要在applicationContext.xml中配置hibernate屬性的時候,加入

                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>