程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Hibernate的配置文件

詳解Hibernate的配置文件

編輯:關於JAVA

Hibernate配置文件主要功能是配置數據庫連接和Hibernate運行時所需的各種屬性,配置文件應該位 於JAVA應用或者JAVA Web應用的類文件中,剛開始接觸Hibernate的時候,感覺Hibernate的配置既繁瑣有 麻煩,不知道童鞋們在學習Hibernate的時候有沒有這種感覺,是不是還在懷念用JDBC連接數據庫呢,但 是繁瑣背後隱藏著巨大的價值,下面我們將帶你一探配置背後的奧秘。

Hibernate配置文件的方式有兩種:一種是通過XML格式文件配置,一種通過JAVA屬性文件配置,屬性 文件配置采用的是“鍵=值”對的方式。建議采用XML格式文件配置格式,XML配置文件可以直 接對映射文件進行配置,配置中每一個類節點對應數據庫表中的關聯信息,在Hibernate初始化階段, mapping節點由Hibernate自動加載到Configration和SessionFactory實例中。而屬性文件配置必須通過編 碼加載映射文件。下面我們將分別對這兩種方式的使用做介紹

1、使用Hibernate.properties屬性文件

對於Hibernate.properties屬性文件配置,在其發布包中的etc下,給出了此文件配置的所有屬性,初 學者可以參照此文件進行配置。通過初始化Configuration實例,通過Configuration實例來加載映射文件 ,加載映射文件的方式有兩種,一種是通過加載資源文件的方式,一種是通過加載類的方式:如下所示:

Configration cfg= new Configuration();

加載資源文件方式

cfg.addResouce("User.hbm.xml");

加載類方式

cfg .addClass(com.cn.User.class) ;

通過多次執行這兩個方法可以添加更多的映射文件。因為要通過編碼方式來加載映射文件,當項目比 較大,資源很多的是時候,用此方法是件很淚奔的事情,所以不建議采用。

2、使用Hibernate.cfg.xml文件

<!--標准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表 明XML文件的編

碼方式-->  
<!--表明解析本XML文件的DTD文檔位置,DTD是DocumentType Definition 的縮寫,  即文檔類型的定

義,
XML解析器使用DTD文檔來檢查XML文件的合法性。 /hibernate.sourceforge.net/hibernate-

configuration-3.0dtd
可以在Hibernate3.1.3軟件包中的src\org\hibernate目錄中找到此文件-->
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!--聲明Hibernate配置文件的開始-->  
<hibernate-configuration>
<!--表明以下的配置是針對session-factory配置的,SessionFactory是 Hibernate中的一個類,
這個類主要負責保存HIbernate的配置信息,以及對Session的操作-->
    <session-factory>
        <!-- hibernate.dialect 只是Hibernate使用的數據庫方言,就是要用Hibernate連接那種類

型的數據庫服務器 -->
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
             
        <!-- 設置數據庫的連接url:jdbc:mysql://localhost/hibernate,
        其中localhost表示mysql服務器名稱,此處為本機,hibernate是數據庫名 -->
        <property name="connection.url">
            jdbc:mysql://127.0.0.1:3306/HibernateTest
        </property>
        <!-- 連接數據庫是用戶名 -->
        <property name="connection.username">root</property>
        <!-- 連接數據庫是密碼 -->
        <property name="connection.password">123456</property>
             
        <!-- 配置數據庫的驅動程序,Hibernate在連接數據庫時,需要用到數據庫的驅動程序 --

>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <!-- jdbc.batch_size是指Hibernate批量插入,刪除和更新時每次操作的記錄數。BatchSize

越大,
        批量操作的向數據庫發送Sql的次數越少,速度就越快,同樣耗用內存就越大 -->
        <property name="jdbc.batch_size">30</property>
        <!-- jdbc.use_scrollable_resultset是否允許Hibernate用JDBC的可滾動的結果集。
        對分頁的結果集。對分頁時的設置非常有幫助 -->
        <property 

name="jdbc.use_scrollable_resultset">false</property>
        <!-- jdbc.fetch_size是指Hibernate每次從數據庫中取出並放到JDBC的Statement中的記錄

條數。
        FetchSize設的越大,讀數據庫的次數越少,速度越快,Fetch Size越小,讀數據庫的次數越多

,速度越慢 -->
        <property name="jdbc.fetch_size">50</property>
        <!-- connection.useUnicode連接數據庫時是否使用Unicode編碼 -->
        <property name="connection.useUnicode">true</property>
        <!-- connection.characterEncoding連接數據庫時數據的傳輸字符集編碼方式,最好設置為

gbk,用gb2312有的字符不全 -->
        <property name="connection.characterEncoding">gbk</property>
        <!-- 是否自動創建數據庫表  他主要有一下幾個值:validate:當sessionFactory創建時,
        自動驗證或者schema定義導入數據庫。  create:每次啟動都drop掉原來的schema,創建新的。  

create-drop:
        當sessionFactory明確關閉時,drop掉schema。update(常用):如果沒有schema就創建,有就更

新。 -->
        <property name="hbm2ddl.auto">create</property>
        <!-- 數據庫連接池的大小 -->
        <property name="connection.pool_size">1</property>
        <!-- 配置此處 sessionFactory.getCurrentSession()可以完成一系列的工作,當調用時,  
        hibernate將session綁定到當前線程,事務結束後,hibernate將session從當前線程中釋放,
        並且關閉session。當再次調用getCurrentSession()時,將得到一個新的session,並重新開始

這一系列工作。 -->
        <property 

name="current_session_context_class">thread</property>
        <property 

name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

;
        <property name="myeclipse.connection.profile">mysql</property>
        <!-- 是否在後台顯示Hibernate用到的SQL語句,開發時設置為true,便於差錯,程序運行時

可以在Eclipse
        的控制台顯示Hibernate的執行Sql語句。項目部署後可以設置為false,提高運行效率 -->
        <property name="show_sql">true</property>
        <!-- 指定映射文件為“om/cn/entity/User.hbm.xml -->
        <mapping resource="com/cn/entity/User.hbm.xml" />
     
    </session-factory>
     
</hibernate-configuration>

以上是Hibernate的常用配置信息,具體的其他配置信息,可以參考Hibernate的具體配置文件。我們 將以current_session_context_class節點的配置信息講解,當此節點的值設置為thread時, sessionFactory.getCurrentSession()可以完成一系列的工作,當調用時,hibernate將session綁定到當 前線程,事務結束後,hibernate將session從當前線程中釋放,並且關閉session。當再次調用 getCurrentSession()時,將得到一個新的session,並重新開始這一系列工作。

1 getCurrentSession創建的session會和綁定到當前線程,而openSession不會。

2 getCurrentSession創建的線程會在事務回滾或事物提交後自動關閉,而openSession必須手動關閉

這裡getCurrentSession本地事務(本地事務:jdbc)時 要在配置文件裡進行如下設置

* 如果使用的是本地事務(jdbc事務)

<property name="hibernate.current_session_context_class">thread</property>

* 如果 使用的是全局事務(jta事務)

<property name="hibernate.current_session_context_class">jta</property>

getCurrentSession () 使用當前的session

 openSession()         重新建立一個新的session

應用程序中,如果DAO 層使用Spring 的hibernate 模板,通過Spring 來 控制session 的生命周期,則首選getCurrentSession ()。

使用Hibernate的大多數應用程序需要某種形式的“上下文相關的” session,特定的 session在整個特定的上下文范圍內始終有效。然而,對不同類型的應用程序而言,要為什麼是組成這種 “上下文”下一個定義通常是困難的;不同的上下文對“當前”這個概念定義了不 同的范圍。在3.0版本之前,使用Hibernate的程序要麼采用自行編寫的基於 ThreadLocal的上下文 session,要麼采用HibernateUtil這樣的輔助類,要麼采用第三方框架(比如Spring或Pico),它們提供 了基於代理(proxy)或者基於攔截器(interception)的上下文相關session。

從3.0.1版本開始,Hibernate增加了SessionFactory.getCurrentSession()方法。一開始,它假定了 采用JTA事務,JTA事務定義了當前session的范圍和上下文(scope and context)。Hibernate開發團隊堅 信,因為有好幾個獨立的JTA TransactionManager實現穩定可用,不論是否被部署到一個J2EE容器中,大 多數(假若不是所有的)應用程序都應該采用JTA事務管理。基於這一點,采用JTA的上下文相關session可 以滿足你一切需要。

最後附上一份從不同層面看Hiberenate的框架圖

接下來的文章,我們將一步一步對Hibernate方方面面進行全面解析。

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved