1. 程式人生 > >Hibernate之對映檔案和主配置檔案詳解

Hibernate之對映檔案和主配置檔案詳解

一、對映配置檔案(xxx.hbm.xml)

<hibernate-mapping>  
      <!--   配置表與實體對映關係 -->
	<class name="com.mark.domain.Customer" table="cst_customer">
 
		<!--    建立類中的屬性與表中的主鍵對映	-->
	 	<id name="cust_id" column="custId">
	 	<!--    	主鍵生成策略			-->
	 		<generator class="native"></generator>
	 	</id>
	 	
	 	<!--    建立類中的普通屬性與表中的欄位對映	-->
	 	<property name="cust_name" column="custName" ></property>
         

        <!--  元件對映:把多個屬性打包在一起當一個屬性使用,用來把類的粒度變小。
        <component name="屬性,這裡指物件">
            <property name="name1"></property>
            <property name="name2"></property>
        </component>-->
          
    <!--<join>:一個物件對映多個表,該元素必須放在所有<property>之後
            <join table="tbl_test:子表名">
                <key column="uuid:子表主鍵"></key>
            <property name="name1:物件屬性" column="name:子表字段"></property>
        </join>-->
	</class>
</hibernate-mapping>

1.hibernate-mapping(根元素,一般不用配置)

(1)schema :指定對映資料庫的schema(模式/資料庫),如果指定該屬性,則表名會自動新增該schema字首

(2)package :指定包字首,指定持久化類所在的包名,這樣之後class子元素中就不必使用全限定性的類名

(3)default-cascade="none":預設的級聯風格,表與表聯動

(4)default-lazy="true":預設延遲載入

2.class(類與表對映關係)

(1)name:持久化類的java全限定名

(2)table:對應資料庫表名,預設持久化類名作為表名

(3)proxy:指定一個介面,在延遲裝載時作為代理使用,也可在這裡指定該類自己的名字

(4)mutable:預設為true,設定為false時則不可以被應用程式更新或刪除,等價於所有<property>元素的update屬性為false,表示整個例項不能被更新

(5)dynamic-insert:預設為false,動態修改那些有改變過的欄位,而不用修改所有欄位

(6)dynamic-update:預設為false,動態插入非空值欄位

(7)select-before-update:預設為false,在修改之前先做一次查詢,與使用者的值進行對比,有變化都會真正更新

(8)optimistic-lock:預設為version(檢查version/timestamp欄位),取值:all(檢查全部欄位)、dirty(只檢查修改過的欄位)

(9)none(不使用樂觀鎖定),此引數主要用來處理併發,每條值都有固定且唯一的版本,版本為最新時才能執行操作;如果需要採用繼承對映,則class元素下還會增加<subclass.../>元素等用於定義子類

3.id(類中屬性與主鍵對映)

(1)name:類中的屬性名

(2)column:表主鍵欄位的名字,如果不填寫與name一樣

(3)type:指定該標識屬性的資料型別,該型別可以是Hibernate的內建型別,也可以是java型別,如果是java型別則需要使用全限定類名(帶包名)。該屬性可選,如果沒有指定型別, 則hibernate自行判斷該標識屬性資料型別

4.generator(主鍵生成策略) 

(1)increment:有Hibernat自動以遞增的方式生成識別符號,每次增量1

(2)identity:由底層資料庫生成識別符號,前提條件是底層資料庫支援自動增長欄位型別。(DB2,MYSQL)

(3)uuid:用128位的UUID演算法生成字串型別識別符號。

(4)assigned:由java程式負責生成識別符號,為了能讓java應用程式設定OID,不能把setId()方法設定成private型別。
讓應用程式在save()之前為物件分配一個識別符號。相當於不指定<generator.../>元素時所採用的預設策略

5.property(類中屬性與表普通欄位對映)

(1)name:標識屬性的名字,以小寫字母開頭

(2)column:表主鍵欄位的名字,如果不填寫與name一樣

(3)update/insert:預設為true,表示可以被更新或插入

(4)access:指定Hibernate訪問持久化類屬性的方式。預設property。property表示使用setter/getter方式,field表示運用java反射機制直接訪問類的屬性

(5)formula:該屬性指定一個SQL表示式,指定該屬性的值將根據表示式類計算,計算屬性沒有和它對應的資料列。formula屬性允許包含表示式:sum,average,max函式求值的結果。例如:formula="(select avg(p.price) from Product P)"

6.component ( 元件對映,把多個屬性打包在一起當一個屬性使用) 

7.join(一個物件對映多個表)

二、對映配置檔案(hibernate.cfg.xml)

<hibernate-configuration>
	<session-factory>
	
	<!-- 	必要配置資訊:連線資料庫的基本資訊		 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///crm</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<!--Hibernate的屬性  -->
		<!--Hibernate的方言:根據配置的方言生成相應的SQL語句  -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!--Hibernate顯示SQL語句  -->
		<property name="hibernate.show_sql">true</property>
		<!--Hibernate格式化SQL語句  -->
		<property name="hibernate.format_sql">true</property>
		
		<!--Hibernate的hbm2ddl(資料庫定義語言:create  drop   alter  update .....)  -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		<!--Hibernate載入對映  -->
		<mapping resource="com/mark/domain/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

1.必選屬性配置(5個)

(1)hibernate.connection.driver_class(資料庫驅動)

(2)hibernate.connection.url(連線資料庫url)

(3)hibernate.connection.username(資料庫連線使用者名稱)

(4)hibernate.connection.password(資料庫連線密碼)

(5)hibernate.dialect(資料庫方言)

2.可選屬性配置(3個)

(1)hibernate.show_sql(控制檯顯示SQL語句)  

(2)hibernate.format_sql(格式化控制檯SQL語句,使之變得更加整潔)

(3)hibernate.hbm2ddl.autoDDL(Hibernate資料庫建表語句)

* none             :不使用Hibernate建表語句

* create           :如果資料庫中已經有表,刪除原有表,重新建立。如果沒有表,新建表(測試時使用)

* create-drop  :如果資料庫中已經有表,刪除原有表,執行操作,刪除這個表。如果沒有表,新建一個,使用完了刪除該表(測試時使用)  

* update          :如果資料庫中有表,使用原有表,如果沒有表,建立新表(更新表結構)

* validate        :如果沒有表,不會建立表。只會使用資料庫中原有的表(校驗對映和表結構)

3.對映配置檔案引入(map  resource)