摘自:http://blog.csdn.net/escode/archive/2008/11/04/3217052.aspx
本文中將講述Hibernate的基本配置及配置文件的應(yīng)用,這對于正確熟練使用Hibernate是相當(dāng)關(guān)鍵的。

  配置文件中映射元素詳解

  對象關(guān)系的映射是用一個(gè)XML文檔來說明的。映射文檔可以使用工具來生成,如XDoclet,Middlegen和AndroMDA等。下面從一個(gè)映射的例子開始講解映射元素,映射文件的代碼如下。

<?xml version="1.0"?>
<!--
所有的XML映射文件都需要定義如下所示的DOCTYPE。
Hibernate會先在它的類路徑(classptah)中搜索DTD文件。

-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--
hibernate-mapping有幾個(gè)可選的屬性:
schema屬性指明了這個(gè)映射的表所在的schema名稱。
default-cascade屬性指定了默認(rèn)的級聯(lián)風(fēng)格 可取值有 none、save、update。
auto-import屬性默認(rèn)讓我們在查詢語言中可以使用非全限定名的類名 可取值有 true、false。
package屬性指定一個(gè)包前綴。
-->

<hibernate-mapping schema="schemaName" default-cascade="none"
auto-import="true" package="test">

<!--用class元素來定義一個(gè)持久化類 -->
<class name="People" table="person">
<!-- id元素定義了屬性到數(shù)據(jù)庫表主鍵字段的映射。-->
<id name="id">
<!-- 用來為該持久化類的實(shí)例生成唯一的標(biāo)識 -->
<generator class="native"/>
</id>
<!-- discriminator識別器 是一種定義繼承關(guān)系的映射方法-->

<discriminator column="subclass" type="character"/>
<!-- property元素為類聲明了一個(gè)持久化的,JavaBean風(fēng)格的屬性-->
<property name="name" type="string">
<column name="name" length="64" not-null="true" />
</property>

<property name="sex"
not-null="true"
update="false"/>

<!--多對一映射關(guān)系-->
<many-to-one name="friend"
column="friend_id"
update="false"/>

<!--設(shè)置關(guān)聯(lián)關(guān)系-->

<set name="friends" inverse="true" order-by="id">
<key column="friend_id"/>
<!—一對多映射-->
<o(jì)ne-to-many class="Cat"/>
</set>
</class>
</hibernate-mapping>

  組件應(yīng)用的方法

  組件有兩種類型,即組件(component)和動態(tài)組件(dynamic-component)。在配置文件中,component元素為子對象的元素與父類對應(yīng)表的字段建立起映射關(guān)系。然后組件可以聲明它們自己的屬性、組件或者集合。component元素的定義如下所示:

<component name="propertyName" class="className" insert="true|false"
upate="true|false" access="field|property|ClassName">

<property ...../>
<many-to-one .... />
........
</component>

  在這段代碼中,name是指屬性名,class是類的名字,insert指的是被映射的字段是否出現(xiàn)在SQL的INSERT語句中,upate指出被映射的字段是否出現(xiàn)在SQL的UPDATE語句中,access指出訪問屬性的策略。
  Hiebernate的基本配置

  Hibernate的數(shù)據(jù)庫連接信息是從配置文件中加載的。Hibernate 的配置文件有兩種形式:一種是XML格式的文件,一種是properties屬性文件。properties形式的配置文件默認(rèn)文件名是 hibernate.properties,一個(gè)properties形式的配置文件內(nèi)容如下所示:

#指定數(shù)據(jù)庫使用的驅(qū)動類
hibernate.connection.driver_class = com.mysql.jdbc.Driver r

#指定數(shù)據(jù)庫連接串
hibernate.connection.url = jdbc:mysql://localhost:3306/db


#指定數(shù)據(jù)庫連接的用戶名
hibernate.connection.username = user

#指定數(shù)據(jù)庫連接的密碼
hibernate.connection.password = password

#指定數(shù)據(jù)庫使用的方言
hibernate.dialect = net.sf.hibernate.dialect.MySQLDialect

#指定是否打印SQL語句
hibernate.show_sql=true

  在配置文件中包含了一系列屬性的配置,Hibernate將根據(jù)這些屬性來連接數(shù)據(jù)庫。

  在XML格式的配置文件中,除了基本的Hibernate配置信息,還可以指定具體的持久化類的映射文件,這可以避免將持久化類的配置文件硬編碼在程序中。XML格式的配置文件的默認(rèn)文件名為hibernate.cfg.xml,一個(gè)XML配置文件的示例如下所示:

<?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-configuration>
<session-factory>
<!--顯示執(zhí)行的SQL語句-->
<property name="show_sql">true</property>

<!--連接字符串-->
<property name="connection.url">jdbc:mysql://localhost:3306/STU</property>

<!--連接數(shù)據(jù)庫的用戶名-->
<property name="connection.username">root</property>

<!--數(shù)據(jù)庫用戶密碼-->
<property name="connection.password">root</property>

<!--數(shù)據(jù)庫驅(qū)動-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<!--選擇使用的方言-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!--映射文件 -->
<mapping resource="com/stuman/domain/Admin.hbm.xml" />

<!--映射文件-->
<mapping resource="com/stuman/domain/Student.hbm.xml" />

</session-factory>
</hibernate-configuration>

  properties形式的配置文件和XML格式的配置文件可以同時(shí)使用。當(dāng)同時(shí)使用兩種類型的配置文件時(shí),XML配置文件中的設(shè)置會覆蓋properties配置文件的相同的屬性。

  對象標(biāo)識符號

  在關(guān)系數(shù)據(jù)庫表中,主鍵(Primary Key)用來識別記錄,并保證每條記錄的唯一性。在Java語言中,通過比較兩個(gè)變量所引用對象的內(nèi)存地址是否相同,或者比較兩個(gè)變量引用的對象值是否相同來判斷兩對象是否相等。Hibernate為了解決兩者之間的不同,使用對象標(biāo)識符(OID)來標(biāo)識對象的唯一性。OID是關(guān)系數(shù)據(jù)庫中主鍵在Java 對象模型中的等價(jià)物。在運(yùn)行時(shí),Hibernate根據(jù)OID來維持Java對象和數(shù)據(jù)庫表中記錄的對應(yīng)關(guān)系。如下代碼所示,三次調(diào)用了Session的 load()方法,分別加載OID為1或3的User對象。

Transaction tx = session.beginTransaction();
User user1 = (User)session.load(User.class,new Long(1));
User user2 = (User)session.load(User.class,new Long(1));
User user3 = (User)session.load(User.class,new Long(3));
System.out.println( user1 == user2 );
System.out.println( user1 == user3 );

  應(yīng)用程序在執(zhí)行上述代碼時(shí),第一次加載OID為1的User對象,從數(shù)據(jù)庫中查找ID為1的記錄,然后創(chuàng)建相應(yīng)的User實(shí)例,并把它保存在 Session緩存中,最后將該實(shí)例的引用賦值給變量user1。第二次加載OID為1的對象時(shí),直接把Session緩存中OID為1的實(shí)例的引用賦值給變量user2。因此,表達(dá)式user1==user2的結(jié)果為true。

  標(biāo)識的生成可以使用不同的策略,表1為Hibernate內(nèi)置的標(biāo)識生成策略。

  表1 Hibernate標(biāo)識生成策略
標(biāo)識符生成器
描述
increment 適用于代理主鍵。由Hibernate自動以遞增方式生成。
identity 適用于代理主鍵。由底層數(shù)據(jù)庫生成標(biāo)識符。
sequence 適用于代理主鍵。Hibernate根據(jù)底層數(shù)據(jù)庫的序列生成標(biāo)識符,這要求底層數(shù)據(jù)庫支持序列。
hilo 適用于代理主鍵。Hibernate分局high/low算法生成標(biāo)識符。
seqhilo 適用于代理主鍵。使用一個(gè)高/低位算法來高效的生成long,short或者int類型的標(biāo)識符。
native 適用于代理主鍵。根據(jù)底層數(shù)據(jù)庫對自動生成標(biāo)識符的方式,自動選擇identity、sequence或hilo。
uuid.hex 適用于代理主鍵。Hibernate采用128位的UUID算法生成標(biāo)識符。

uuid.string
適用于代理主鍵。UUID被編碼成一個(gè)16字符長的字符串。
assigned 適用于自然主鍵。由Java應(yīng)用程序負(fù)責(zé)生成標(biāo)識符。
foreign 適用于代理主鍵。使用另外一個(gè)相關(guān)聯(lián)的對象的標(biāo)識符。
  Hibernate映射類型

  在對象/關(guān)系映射文件中,Hibernate采用映射類型作為Java類型和SQL類型的橋梁。Hibernate映射類型分為2種:內(nèi)置映射類型和自定義映射類型。

  1、內(nèi)置映射類型

  Hibernate對所有的Java原生類型、常用的Java類型如String、Date等都定義了內(nèi)置的映射類型。表2列出了Hibernate映射類型、對應(yīng)的Java類型以及對應(yīng)的標(biāo)準(zhǔn)SQL類型。

  表2 Hibernate內(nèi)置映射類型
Hibernate映射類型 Java類型 標(biāo)準(zhǔn)SQL類型 大小
integer/int java.lang.Integer/int INTEGER 4字節(jié)
long java.lang.Long/long BIGINT 8字節(jié)
short java.lang.Short/short SMALLINT 2字節(jié)
byte java.lang.Byte/byte TINYINT 1字節(jié)
float java.lang.Float/float FLOAT 4字節(jié)
double java.lang.Double/double DOUBLE 8字節(jié)
big_decimal java.math.BigDecimal NUMERIC  
character java.lang.Character/java.lang.String/char CHAR(1) 定長字符
string java.lang.String VARCHAR 變長字符
boolean/ yes_no/true_false java.lang.Boolean/Boolean BIT 布爾類型
date java.util.Date/java.sql.Date DATE 日期
timestamp java.util.Date/java.util.Timestamp TIMESTAMP 日期
calendar java.util.Calendar TIMESTAMP 日期
calendar_date java.util.Calendar DATE 日期
binary byte[] BLOB
BLOB
text java.lang.String TEXT CLOB
serializable 實(shí)現(xiàn)java.io.Serializablej接口的任意Java類 BLOB BLOB
clob java.sql.Clob CLOB CLOB
blob java.sql.Blob BLOB BLOB
class java.lang.Class VARCHAR 定長字符
locale java.util.Locale VARCHAR 定長字符
timezone java.util.TimeZone VARCHAR 定長字符
currency java.util.Currency VARCHAR 定長字符

  2、自定義映射類型

  Hibernate提供了自定義映射類型接口,允許用戶以編程的方式創(chuàng)建自定義的映射類型。用戶自定義的映射類型需要實(shí)現(xiàn) net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType接口。具體的創(chuàng)建自定義映射類型的方法請參考hibernate官方文檔或相關(guān)資料,這里不再詳細(xì)介紹。