Hibernate運行原理

Hibernate運行原理

Hibernate是一個開放源代碼的對象關係映射框架,她對JDBC進行了非常輕量級的對象封裝,使得java程序員可以隨心所欲的使用對象編程思維來操縱數據庫,hibernate可以應用在任何使用JDBC的場合,既可以在java的客戶端程序使用,也可以在Servlet/jsp中的Web應用中使用。最具革命意義的是,hibernate可以在應用的EJB的j2ee架構中取代cmp,完成數據持久化的重任。下面通過一張圖來分析Hibernate的運行原理:


上面的執行過程圖已經很清晰的闡釋了hibernate的運行過程:首先,應用程序先調用Configration類,該類讀取hibernate的配置文件及映射文件中的信息(如果我們使用註解的話則不需要讀取映射文件),並使用這些信息生成一個SessionFactory對象。接着,從SessionFacctory生成一個Session對象,並用Session對象生成Transaction對象。通過Session對象的get()、sava()、update()、delete()和saveOrupdate()等方法對PO進行加載,保存,更新,刪除等操作;在查詢的情況下,可通過Session對象生成一個Query對象,然後利用Query對象執行查詢操作。如果沒有異常,Transaction對象將提交這些操作結果到數據庫中,否則會回滾事務。

Hibernate基本配置

hibernate.cfg.xml配置文件:
<span style="font-size:14px;"><!DOCTYPE hibernate-configuration PUBLIC  
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  
<hibernate-configuration>  
    <session-factory>  
        <!-- 設置數據庫驅動 -->  
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
        <!-- 設置數據庫URL -->  
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>  
        <!-- 數據庫用戶名 -->  
        <property name="hibernate.connection.username">root</property>  
        <!-- 數據庫密碼 -->  
        <property name="hibernate.connection.password">123456</property>  
        <!-- 指定對應數據庫的方言,hibernate爲了更好適配各種關係數據庫,針對每種數據庫都指定了一個方言dialect -->  
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
	
	<!-- 打印sql語句,方便調試 -->
        <property name="show_sql">true</property>
	<!-- 格式化sql語句,排版 -->
	<property name="foramt_sql">true</property>
	<!-- 指定hibernate生成數據庫表的方式:create每次創建新表,update使用原表 -->
	<property name="hbm2ddl.auto">update</property>
	<!-- 使用session.getCurrentSession時需要打開該配置 -->
	<property name="hibernate.current_session_context_class">true</property>

        <!-- 映射文件 -->  
        <mapping resource="com/pechen/hibernate/User.hbm.xml"/>  
    </session-factory>  
</hibernate-configuration>  </span>
*.hbm.xml映射文件:
<span style="font-size:14px;"><?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping>  
    <!--生成默認爲user的數據庫表-->  
    <class name="com.pechen.hibernate.User">  
        <id name="id">  
            <!-- 算法的核心思想是結合機器的網卡、當地時間、一個隨機數來生成GUID -->  
            <generator class="uuid"></generator>  
        </id>  
        <property name="name"></property>  
        <property name="password"></property>  
        <property name="createTime" type="date"></property>  
        <property name="expireTime" type="date"></property>  
    </class>  
      
</hibernate-mapping></span>

Hibernate優缺點

優點:
  • 更加對象化:以對象化的思維操作數據庫,我們只需要操作對象就可以了,開發更加對象化。
  • 移植性:因爲Hibernate做了持久層的封裝,你就不知道數據庫,你寫的所有的代碼都具有可複用性。
  • Hibernate是一個沒有侵入性的框架,沒有侵入性的框架我們稱爲輕量級框架。對比Struts的Action和ActionForm,都需要繼承,離不開Struts。Hibernate不需要繼承任何類,不需要實現任何接口。這樣的對象叫POJO對象。測試更加方便,提高了效率。
缺點:
  • 由於對持久層封裝過於完整,導致開發人員無法對SQL進行優化,無法靈活使用JDBC的原生SQL,Hibernate封裝了JDBC,所以沒有JDBC直接訪問數據庫效率高。要使用數據庫的特定優化機制的時候,不適合用Hibernate。
  • 框架中使用ORM原則,導致配置過於複雜,一旦遇到大型項目,配置文件和內容是非常龐大的,另外DTO滿天飛,性能和維護問題隨之而來。
  • 如果項目中各個表中關係複雜,表之間的關係很多,在很多地方把lazy都設置false,會導致數據查詢和加載很慢,尤其是級聯查詢的時候。
  • Hibernate在批量數據處理時有弱勢,對於批量的修改,刪除,不適合用Hibernate,這也是ORM框架的弱點。



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