Hibernate映射的基本操做


Hibernate映射主要是經過對象關係映射文件實現,對象關係映射文件把數據庫中的實體(通常爲二維表)映射到面向對象中的實體對象,把數據庫中多個表之間的相互關係也反映到映射好的類中。之後,在Hibernate中對數據庫的操做就直接轉換爲對這些實體對象的操做了。
1.    映射文件說明:
正確理解各個配置選項的含義是掌握映射文件的關鍵。映射文件能夠對面向對象中的關聯關係、繼承關係和組合關係等各類關係進行配置。如:
<!-- XML 文件的聲明  -->
<? xml  version = "1.0"  encoding = "utf-8" ?>
<!-- hibernate DTD 文件的聲明  -->
<! DOCTYPE  hibernate-mapping  PUBLIC
         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!--  映射文件的根節點  -->
< hibernate-mapping >
<!--
對象關係映射的開始: class 元素表示類和數據庫中的表的映射關係。
name 屬性指定持久化類(或者接口)的 Java 全限定名;
table 屬性指定要映射的對應的數據庫表名
 -->
     < class  name = "org.qiujy.bean.User"  table = "user" >
     <!--
持久化類對象的對象標識符 (OID) 和表的主鍵的映射關聯:
name 屬性指定類中做爲 OID 的屬性名;
column 屬性表中主鍵字段的名字;
type 屬性指定 Hibernate 的映射類型
      -->
         < id  name = "id"  column = "id"  type = "int" >
              <!--  指定對象標識符生成器: class 屬性指定生成器的類別名  -->
             < generator  class = "native" />
         </ id >
         <!--
普通屬性的映射:
name 屬性:屬性的名字 , 以小寫字母開頭;
column 屬性:對應的數據庫字段名
type 屬性: 指定 Hibernate 的映射類型
-->
         < property  name = "name"  column = "name"  type = "string" />
         < property  name = "age"  column = "age"  type = "int" />
     </ class >
</ hibernate-mapping >
 
2.    Hibernate映射類型:
在對象-關係映射文件中,Hibernate映射類型做爲Java類型和SQL類型的橋樑。在映射文件中建議使用Hibernate映射類型。
2.1.         java基本映射類型的Hibernate映射類型:
Java類型、Hibernate映射類型以及SQL類型之間的對應關係:
Java類型 Hibernate映射類型 標準SQL類型
int或java.lang.Integer integer或int INTEGER
long或java.lang.Long long BIGINT
short或java.lang.Short short SMALLINT
byte或java.lang.Byte byte TINYINT
float或java.lang.Float float FLOAT
double或java.lang.Double double DOUBLE
java.math.BigDecimal big_decimal NUMERIC
char或java.lang.Character character CHAR(1)
java.lang.String string VARCHAR
boolean或java.lang.Boolean boolean BIT
boolean或java.lang.Boolean yes_no CHAR(1)('Y'或' N')
boolean或java.lang.Boolean true_false CHAR(1)('T'或' F')
 
2.2.         java時間和日期類型的Hibernate映射類型:
Java類型 Hibernate映射類型 標準SQL類型 說明
java.util.Date或java.sql.Date date DATE 日期
java.util.Date或java.sql.Time time TIME 時間
java.util.Date或java.sql.Timestamp timestamp TIMESTAMP 時間戳
java.util.Calendar calendar TIMESTAMP  
java.util.Calendar calendar_date DATE  
 
2.3.         java大對象類型的Hibernate映射類型:
Java類型 Hibernate映射類型 標準SQL類型 MySQL類型 Oracle類型
byte[] binary VARBINARY(或者BLOB) BLOB BLOB
java.lang.String text CLOB TEXT CLOB
實現java.io.Serializable接口的任意一個java serializable VARBINARY(或者BLOB) BLOB BLOB
java.sql.Clob clob CLOB TEXT CLOB
java.sql.Blob blob BLOB BLOB BLOB
 
3.    映射對象標識符(OID)
Hibernate中使用對象標識符(OID)來唯一標識一個對象。爲了應付多變的業務要求,Hibernate制定了多種主鍵生成器。在hibernate的映射文件中,能夠指定主鍵的生成器,如:
< id  name = "id"  column = "id"  type = "int" >
     < generator  class = "native" />
</ id >
Hibernate提供的幾種內置標識符生成器:
標識符生成器 描述
increment hibernate自動以遞增的方式生成標識符,每次增量爲1.適用於代理主鍵
identity 由底層數據庫生成標識符.數據庫必須支持自動增加字段類型,不便於不一樣數據庫之間的移植.適用於代理主鍵
sequence Hibernate根據底層數據庫序列來生成標識符.前提是條件是底層數據庫支持序列(如Oracle).適用於代理主鍵
hilo Hibernate根據high/how算法來生成標識符.適用於代理主鍵
seqhilo 使用一個高/低位算法來高效的生成longshort 或者 int類型的標識符,給定一個數據庫序列(sequence)的名字.適用於代理主鍵
native 根據底層數據庫對自動生成標識符的支持能力,來選擇identity,sequence或hilo.適用於代理主鍵
uuid.hex Hibernate採用128位的UUID(Universal Unique Identification)算法來生成標識符.UUID算法可以在網絡環境中生成惟一的字符串標識符.但字符串型的主鍵比整型的主鍵佔用更多的數據庫空間.適用於代理主鍵
uuid.string 使用UUID算法來生成標識符.UUID被編碼爲一個16個字符長的任意ASCII組成的字符串。適用於代理主鍵
assigned 由Java應用程序負責生成標識符,需在保存數據前完成.適用於天然主鍵
4.    映射天然主鍵:
代理主鍵是指與業務邏輯沒有聯繫的主鍵,而天然主鍵指與業務邏輯相關的主鍵。 Hibernate 中推薦使用代理主鍵,而應該儘可能不使用天然主鍵,由於天然主鍵與業務邏輯聯繫緊密,一旦天然主鍵的需求發生變化,與之相關的程序就要變化。天然主鍵在遺留的舊系統中仍然大量的存在。
如:某人設計的學生表中沒有定義代理主鍵ID,而是以學號(no)字段做爲主鍵,那麼相應的學生類中沒必要定義屬性ID,而是以no屬性做爲OID。映射文件爲:
……
< id  name = "no"  column = "no"  type = "int" >
     <!--  指定主鍵生成方式爲 Assigned -->
     < generator  class = "assigned" />
</ id >
……
也就是說由程序負責給主鍵賦值。
5.    映射覆合天然主鍵:
如某人設計的學生表中沒有定義代理主鍵ID,而是以姓(firstname)字段和名(lastname)字段做爲複合主鍵,那麼相應的學生類中沒必要定義屬性ID。而是以firstName屬性和lastName做爲OID,它的映射代碼以下:
……
<composite- id>
<key-property  name = "firstName"  column = "firstname"  type = "string" >
      < key-property  name = "lastName"  column = "lastname"  type = "string" >
</composite- id >
……
注意:此時的student類由於帶有複合的OID,這個類必須實現java.io.Serializable接口,用firstName和lastName這兩個屬性重寫equals()和hashcode()方法。
還有一種方式是先定義單獨的主鍵類,而後在Student類中定義該主鍵類的一個屬性。在此再也不贅述。
轉載地址:
相關文章
相關標籤/搜索