Hibernate設定檔中映射元素詳解

來源:互聯網
上載者:User
詳解   本文中將講述Hibernate的基本配置及設定檔的應用,這對於正確熟練使用Hibernate是相當關鍵的。

   設定檔中映射元素詳解

  對象關係的映射是用一個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官方文檔或相關資料,這裡不再詳細介紹。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。