設定檔中映射元素詳解 對象關係的映射是用一個XML文檔來說明的。映射文檔可以使用工具來產生,如XDoclet,Middlegen和AndroMDA等。下面從一個映射的例子開始講解映射元素,對應檔的代碼如下。
<?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有幾個可選的屬性:
schema屬性指明了這個映射的表所在的schema名稱。
default-cascade屬性指定了預設的級聯風格 可取值有 none、save、update。
auto-import屬性預設讓我們在查詢語言中可以使用非全限定名的類名 可取值有 true、false。
package屬性指定一個包首碼。
--> <hibernate-mapping schema="schemaName" default-cascade="none"
auto-import="true" package="test"> <!--用class元素來定義一個持久化類 -->
<class name="People" table="person">
<!-- id元素定義了屬性到資料庫表主鍵欄位的映射。-->
<id name="id">
<!-- 用來為該持久化類的執行個體產生唯一的標識 -->
<generator class="native"/>
</id>
<!-- discriminator辨識器 是一種定義繼承關係的映射方法--> <discriminator column="subclass" type="character"/>
<!-- property元素為類聲明了一個持久化的,JavaBean風格的屬性-->
<property name="name" type="string">
<column name="name" length="64" not-null="true" />
</property> <property name="sex"
not-null="true"
update="false"/> <!--多對一映射關係-->
<many-to-one name="friend"
column="friend_id"
update="false"/> <!--設定關聯關係--> <set name="friends" inverse="true" order-by="id">
<key column="friend_id"/>
<!—一對多映射-->
<one-to-many class="Cat"/>
</set>
</class>
</hibernate-mapping>
|
組件應用的方法 組件有兩種類型,即組件(component)和動態組件(dynamic-component)。在設定檔中,component元素為子物件的元素與父類對應表的欄位建立起映射關係。然後組件可以聲明它們自己的屬性、組件或者集合。component元素的定義如下所示:
<component name="propertyName" class="className" insert="true|false"
upate="true|false" access="field|property|ClassName"> <property ...../>
<many-to-one .... />
........
</component>
|
在這段代碼中,name是指屬性名稱,class是類的名字,insert指的是被映射的欄位是否出現在SQL的INSERT語句中,upate指出被映射的欄位是否出現在SQL的UPDATE語句中,access指出訪問屬性的策略。 Hiebernate的基本配置 Hibernate的資料庫連接資訊是從設定檔中載入的。Hibernate的設定檔有兩種形式:一種是XML格式的檔案,一種是properties屬性檔案。properties形式的設定檔預設檔案名稱是hibernate.properties,一個properties形式的設定檔內容如下所示:
#指定資料庫使用的驅動類
hibernate.connection.driver_class = com.mysql.jdbc.Driver r
#指定資料庫連接串
hibernate.connection.url = jdbc:mysql://localhost:3306/db
#指定資料庫連接的使用者名稱
hibernate.connection.username = user
#指定資料庫連接的密碼
hibernate.connection.password = password
#指定資料庫使用的方言
hibernate.dialect = net.sf.hibernate.dialect.MySQLDialect
#指定是否列印SQL語句
hibernate.show_sql=true
|
在設定檔中包含了一系列屬性的配置,Hibernate將根據這些屬性來串連資料庫。 在XML格式的設定檔中,除了基本的Hibernate配置資訊,還可以指定具體的持久化類的對應檔,這可以避免將持久化類的設定檔寫入程式碼在程式中。XML格式的設定檔的預設檔案名稱為hibernate.cfg.xml,一個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>
<!--顯示執行的SQL語句-->
<property name="show_sql">true</property> <!--連接字串-->
<property name="connection.url">jdbc:mysql://localhost:3306/STU</property> <!--串連資料庫的使用者名稱-->
<property name="connection.username">root</property> <!--資料庫使用者密碼-->
<property name="connection.password">root</property> <!--資料庫驅動-->
<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格式的設定檔可以同時使用。當同時使用兩種類型的設定檔時,XML設定檔中的設定會覆蓋properties設定檔的相同的屬性。 物件識別碼號 在關聯式資料庫表中,主鍵(Primary Key)用來識別記錄,並保證每條記錄的唯一性。在Java語言中,通過比較兩個變數所引用對象的記憶體位址是否相同,或者比較兩個變數引用的對象值是否相同來判斷兩對象是否相等。Hibernate為瞭解決兩者之間的不同,使用物件識別碼(OID)來標識對象的唯一性。OID是關聯式資料庫中主鍵在Java物件模型中的等價物。在運行時,Hibernate根據OID來維持Java對象和資料庫表中記錄的對應關係。如下代碼所示,三次調用了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 );
|
應用程式在執行上述代碼時,第一次載入OID為1的User對象,從資料庫中尋找ID為1的記錄,然後建立相應的User執行個體,並把它儲存在Session緩衝中,最後將該執行個體的引用賦值給變數user1。第二次載入OID為1的對象時,直接把Session緩衝中OID為1的執行個體的引用賦值給變數user2。因此,運算式user1==user2的結果為true。 標識的產生可以使用不同的策略,表1為Hibernate內建的標識建置原則。 表1:Hibernate標識建置原則
| 標識符產生器 |
描述 |
| increment |
適用於代理主鍵。由Hibernate自動以遞增方式產生。 |
| identity |
適用於代理主鍵。由底層資料庫產生標識符。 |
| sequence |
適用於代理主鍵。Hibernate根據底層資料庫的序列產生標識符,這要求底層資料庫支援序列。 |
| hilo |
適用於代理主鍵。Hibernate分局high/low演算法產生標識符。 |
| seqhilo |
適用於代理主鍵。使用一個高/低位演算法來高效的產生long,short或者int類型的標識符。 |
| native |
適用於代理主鍵。根據底層資料庫對自動產生標識符的方式,自動選擇identity、sequence或hilo。 |
| uuid.hex |
適用於代理主鍵。Hibernate採用128位的UUID演算法產生標識符。 |
| uuid.string |
適用於代理主鍵。UUID被編碼成一個16字元長的字串。 |
| assigned |
適用於自然主鍵。由Java應用程式負責產生標識符。 |
| foreign |
適用於代理主鍵。使用另外一個相關聯的對象的標識符。 |
Hibernate映射類型 在對象/關係對應檔中,Hibernate採用映射類型作為Java類型和SQL類型的橋樑。Hibernate映射類型分為2種:內建映射類型和自訂映射類型。 1、內建映射類型 Hibernate對所有的Java原生類型、常用的Java類型如String、Date等都定義了內建的映射類型。表2列出了Hibernate映射類型、對應的Java類型以及對應的標準SQL類型。 表2:Hibernate內建映射類型
| Hibernate映射類型 |
Java類型 |
標準SQL類型 |
大小 |
| integer/int |
java.lang.Integer/int |
INTEGER |
4位元組 |
| long |
java.lang.Long/long |
BIGINT |
8位元組 |
| short |
java.lang.Short/short |
SMALLINT |
2位元組 |
| byte |
java.lang.Byte/byte |
TINYINT |
1位元組 |
| float |
java.lang.Float/float |
FLOAT |
4位元組 |
| double |
java.lang.Double/double |
DOUBLE |
8位元組 |
| 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 |
實現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提供了自訂映射類型介面,允許使用者以編程的方式建立自訂的映射類型。使用者自訂的映射類型需要實現net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType介面。具體的建立自訂映射類型的方法請參考hibernate官方文檔或相關資料,這裡不再詳細介紹。 |