<!--標準的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的編碼方式-->
<?xml version='1.0' encoding='gb2312'?>
<!--表明解析本XML文件的DTD文檔位置,DTD是Document Type Definition 的縮寫,即文檔類型的定義,XML解析器使用DTD文檔來檢查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3軟件包中的src/org/hibernate目錄中找到此文件-->
<!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在連接數據庫時,需要用到數據庫的驅動程序--
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--設置數據庫的連接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql服務器名稱,此處爲本機, hibernate是數據庫名-->
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate</hibernate>
<!--連接數據庫是用戶名-->
<property name="hibernate.connection.username">root</property>
<!--連接數據庫是密碼-->
<property name="hibernate.connection.password">123456</property>
<!--數據庫連接池的大小-->
<property name="hibernate.connection.pool.size">20</property>
<!--是否在後臺顯示Hibernate用到的SQL語句,開發時設置爲true,便於差錯,程序運行時可以在Eclipse的控制檯顯示Hibernate的執行Sql語句。項目部署後可以設置爲false,提高運行效率-->
<property name="hibernate.show_sql">true</property>
<!--jdbc.fetch_size是指Hibernate每次從數據庫中取出並放到JDBC的Statement中的記錄條數。Fetch Size設的越大,讀數據庫的次數越少,速度越快,Fetch Size越小,讀數據庫的次數越多,速度越慢-->
<property name="jdbc.fetch_size">50</property>
<!--jdbc.batch_size是指Hibernate批量插入,刪除和更新時每次操作的記錄數。Batch Size越大,批量操作的向數據庫發送Sql的次數越少,速度就越快,同樣耗用內存就越大-->
<property name="jdbc.batch_size">23</property>
<!--jdbc.use_scrollable_resultset是否允許Hibernate用JDBC的可滾動的結果集。對分頁的結果集。對分頁時的設置非常有幫助-->
<property name="jdbc.use_scrollable_resultset">false</property>
<!--connection.useUnicode連接數據庫時是否使用Unicode編碼-->
<property name="Connection.useUnicode">true</property>
<!--connection.characterEncoding連接數據庫時數據的傳輸字符集編碼方式,最好設置爲gbk,用gb2312有的字符不全-->
<property name="connection.characterEncoding">gbk</property>
<!--hibernate.dialect 只是Hibernate使用的數據庫方言,就是要用Hibernate連接那種類型的數據庫服務器。-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--指定映射文件爲“hibernate/ch1/UserInfo.hbm.xml”-->
<mapping resource="org/mxg/UserInfo.hbm.xml">
</session-factory>
</hibernate-configuration>
配置文件中映射元素詳解 對象關係的映射是用一個XML文檔來說明的。映射文檔可以使用工具來生成,如XDoclet,Middlegen和AndroMDA等。下面從一個映射的例子開始講解映射元素,映射文件的代碼如下。
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
組件應用的方法 組件有兩種類型,即組件(component)和動態組件(dynamic-component)。在配置文件中,component元素爲子對象的元素與父類對應表的字段建立起映射關係。然後組件可以聲明它們自己的屬性、組件或者集合。component元素的定義如下所示:
在這段代碼中,name是指屬性名,class是類的名字,insert指的是被映射的字段是否出現在SQL的INSERT語句中,upate指出被映射的字段是否出現在SQL的UPDATE語句中,access指出訪問屬性的策略。 Hiebernate的基本配置 Hibernate的數據庫連接信息是從配置文件中加載的。Hibernate的配置文件有兩種形式:一種是XML格式的文件,一種是properties屬性文件。properties形式的配置文件默認文件名是hibernate.properties,一個properties形式的配置文件內容如下所示:
在配置文件中包含了一系列屬性的配置,Hibernate將根據這些屬性來連接數據庫。 在XML格式的配置文件中,除了基本的Hibernate配置信息,還可以指定具體的持久化類的映射文件,這可以避免將持久化類的配置文件硬編碼在程序中。XML格式的配置文件的默認文件名爲hibernate.cfg.xml,一個XML配置文件的示例如下所示:
properties形式的配置文件和XML格式的配置文件可以同時使用。當同時使用兩種類型的配置文件時,XML配置文件中的設置會覆蓋properties配置文件的相同的屬性。
對象標識符號 在關係數據庫表中,主鍵(Primary Key)用來識別記錄,並保證每條記錄的唯一性。在Java語言中,通過比較兩個變量所引用對象的內存地址是否相同,或者比較兩個變量引用的對象值是否相同來判斷兩對象是否相等。Hibernate爲了解決兩者之間的不同,使用對象標識符(OID)來標識對象的唯一性。OID是關係數據庫中主鍵在Java對象模型中的等價物。在運行時,Hibernate根據OID來維持Java對象和數據庫表中記錄的對應關係。如下代碼所示,三次調用了Session的load()方法,分別加載OID爲1或3的User對象。
應用程序在執行上述代碼時,第一次加載OID爲1的User對象,從數據庫中查找ID爲1的記錄,然後創建相應的User實例,並把它保存在Session緩存中,最後將該實例的引用賦值給變量user1。第二次加載OID爲1的對象時,直接把Session緩存中OID爲1的實例的引用賦值給變量user2。因此,表達式user1==user2的結果爲true。 標識的生成可以使用不同的策略,表1爲Hibernate內置的標識生成策略。 表1:Hibernate標識生成策略
Hibernate映射類型 在對象/關係映射文件中,Hibernate採用映射類型作爲Java類型和SQL類型的橋樑。Hibernate映射類型分爲2種:內置映射類型和自定義映射類型。 1、內置映射類型 Hibernate對所有的Java原生類型、常用的Java類型如String、Date等都定義了內置的映射類型。表2列出了Hibernate映射類型、對應的Java類型以及對應的標準SQL類型。 表2:Hibernate內置映射類型
hibernate-mapping <hibernate-mapping 假若你有兩個持久化類,它們的非全限定名是一樣的(就是在不同的包裏面--譯者注),你應該設置auto-import="false"。假若說你把一個“import過”的名字同時對應兩個類, Hibernate會拋出一個異常。 5.1.3. class <class 若指明的持久化類實際上是一個接口,也可以被完美地接受。其後你可以用<subclass>來指定該接口的實際實現類名。你可以持久化任何static(靜態的)內部類。記得應該使用標準的類名格式,就是說比如:Foo$Bar。 不可變類,mutable="false"不可以被應用程序更新或者刪除。這可以讓Hibernate做一些小小的性能優化。 可選的proxy屬性可以允許延遲加載類的持久化實例。Hibernate開始會返回實現了這個命名接口的CGLIB代理。當代理的某個方法被實際調用的時候,真實的持久化對象纔會被裝載。參見下面的“用於延遲裝載的代理”。 Implicit (隱式)的多態是指,如果查詢中給出的是任何超類、該類實現的接口或者該類的名字,都會返回這個類的實例;如果查詢中給出的是子類的名字,則會返回子類的實例。 Explicit (顯式)的多態是指,只有在查詢中給出的明確是該類的名字時纔會返回這個類的實例;同時只有當在這個<class>的定義中作爲<subclass>或者<joined-subclass>出現的子類,纔會可能返回。大多數情況下,默認的polymorphism="implicit"都是合適的。顯式的多態在有兩個不同的類映射到同一個表的時候很有用。(允許一個“輕型”的類,只包含部分表字段)。 persister屬性可以讓你定製這個類使用的持久化策略。你可以指定你自己實現的net.sf.hibernate.persister.EntityPersister的子類,你甚至可以完全從頭開始編寫一個net.sf.hibernate.persister.ClassPersister接口的實現,可能是用儲存過程調用、序列化到文件或者LDAP數據庫來實現的。參閱net.sf.hibernate.test.CustomPersister,這是一個簡單的例子(“持久化”到一個Hashtable)。 請注意dynamic-update和dynamic-insert的設置並不會繼承到子類,所以在<subclass>或者<joined-subclass>元素中可能需要再次設置。這些設置是否能夠提高效率要視情形而定。請用你的智慧決定是否使用。 使用select-before-update通常會降低性能.當是在防止數據庫不必要的觸發update觸發器,這就很有用了。 如果你打開了dynamic-update,你可以選擇幾種樂觀鎖定的策略: version(版本檢查)檢查version/timestamp字段 all(全部) 檢查全部字段 dirty(髒檢查)只檢察修改過的字段 none(不檢查)不使用樂觀鎖定 我們非常強烈建議你在Hibernate中使用version/timestamp字段來進行樂觀鎖定。對性能來說,這是最好的選擇,並且這也是唯一能夠處理在session外進行操作的策略(就是說,當使用Session.update()的時候)。 5.1.4. id <id <generator class="generatorClass"/> 如果 name屬性不存在,會認爲這個類沒有標識屬性。 unsaved-value 屬性很重要!如果你的類的標識屬性不是默認爲null的,你應該指定正確的默認值。 還有一個另外的<composite-id>聲明可以訪問舊式的多主鍵數據。我們強烈不鼓勵使用這種方式。 5.1.4.1. generator <id name="id" type="long" column="uid" unsaved-value="0"> increment(遞增) identity sequence (序列) hilo (高低位) seqhilo(使用序列的高低位) uuid.hex uuid.string native(本地) assigned(程序設置) foreign(外部引用) |