理解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.     
  5. <hibernate-configuration>    
  6.     <session-factory>    
  7.         <!-- 設置數據庫驅動 -->    
  8.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>    
  9.         <!-- 設置數據庫URL -->    
  10.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>    
  11.         <!-- 數據庫用戶名 -->    
  12.         <property name="hibernate.connection.username">root</property>    
  13.         <!-- 數據庫密碼 -->    
  14.         <property name="hibernate.connection.password">123456</property>    
  15.         <!-- 指定對應數據庫的方言,hibernate爲了更好適配各種關係數據庫,針對每種數據庫都指定了一個方言dialect -->    
  16.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>    
  17.       
  18.     <!-- 打印sql語句,方便調試 -->  
  19.         <property name="show_sql">true</property>  
  20.     <!-- 格式化sql語句,排版 -->  
  21.     <property name="foramt_sql">true</property>  
  22.     <!-- 指定hibernate生成數據庫表的方式:create每次創建新表,update使用原表 -->  
  23.     <property name="hbm2ddl.auto">update</property>  
  24.     <!-- 使用session.getCurrentSession時需要打開該配置 -->  
  25.     <property name="hibernate.current_session_context_class">true</property>  
  26.   
  27.         <!-- 映射文件 -->    
  28.         <mapping resource="com/pechen/hibernate/User.hbm.xml"/>    
  29.     </session-factory>    
  30. </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.         
  18. </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對象的三種狀態

         

(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、四種事務隔離級別

(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> 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章