開頭
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>
實體
<hibernate-mapping package="domain" >
<class name="Employee" table="employee">
<id><!--主鍵屬性映射-->
<property><!--普通屬性映射-->
<XXX><!--實例對象屬性映射-->
</class>
</hibernate-mapping>
注意點
<hibernate-mapping>
可以寫多個類的映射,一般就寫一個<class>
的table和屬性的colum可以省,會自動以類名或屬性名寫入- 訪問方式是通過屬性的setter和getter方式訪問.不論private或public.(Struts2框架必須public)
class標籤
- dynamic-insert:默認爲true,表示當屬性屬性沒值時候,不出現在insert語句;取數據庫的默認值;(反之創送的屬性爲null)
- dynamic-update:默認爲true,當屬性沒值時候,不出現在update語句;不改變其數據庫的值;(反之創送的屬性爲null)
hibernate-mapping標籤
- package:需要映射的類所在的包;
- auto-import:默認爲true;表示該標籤下的被映射的類,別名就是其簡單類名,主要用於HQL語句
####自定義別名
<!--與class同級,在其之後-->
<import class="類的全限名" rename="別名"/>
主鍵和普通屬性的映射
1.主鍵的映射
<id name="id" >
<generator class="native" />
</id>
<generator/>
是主鍵生成策略
- assigned:
- 業務主鍵,需要用戶手動輸入的主鍵
- 若有第二個主鍵,用
<composite-id>
來設置
- uuid:
- Hibernate生成主鍵
- 類型爲String,由UUID生成永不唯一的標識符
- increment:
- Hibernate生成的主鍵
- 啓動Hibernate時候,從數據庫取該主鍵max(id),通過緩存 key:表明,value:下個主鍵值.,每次增加操作取主鍵都從緩存中取,然後再自增.
- 性能超羣,但不能用於集成環境.
- identity:
- 數據生成的主鍵
- 只支持MySQL,所以不能數據庫的遷移
- native(常用):
- 數據庫生成的主鍵
- 在MySQL中等價於 identity
- 在Oracle中等價於 sequence
- TableGenerator:
- Hibernate生成的主鍵
- 全名org.hibernate.id.enhanced.TableGenerator;是一個類
<id name="id" >
<generator class="org.hibernate.id.enhanced.TableGenerator" >
<param name="segment_value">employeeID</param>
<param name="initial_value">1</param>
<param name="increment_size">100</param>
</generator>
</id>
- segment_value表示sequence_name值
- initial_value表示初始值
- increment_size表示提取量.
- 性能超羣,可以用於集成環境
- Hibernate的值沒用完,會造成該表的主鍵不連續問題
- 流程:
- 在數據中生成一張表格hibernate_sequences:
- sequence_name表格對應的名
- next_val,下一次存入緩存的id值
- 第一次:讀取employee的當前最大id值
- 將最大id值+size;存入Hibernate的緩存中,表示當操作時候,累計用到該值時候,去數據庫中的表格hibernate_sequences取next_val
- 將segment_value存入sequence_name;
- 將最大id值+size*2;存入next_val;表示下一次存入Hibernate緩存的id值
- 非第一次,達到緩存中的值時候,直接去表格hibernate_sequences取next_val.
- 非第一次,達到緩存中的值時候,直接去表格hibernate_sequences取next_val.
- 在數據中生成一張表格hibernate_sequences:
集成環境
- 一個服務器的訪問量有限,爲了擴大性能,多個服務器中部署同一個web應用.
- 此時一臺電腦或一個會話,只使用固定的服務器,保證session數據不會請求到另外一個服務器而丟失
- increment方式是伴隨整個應用的,每個服務器都會記錄緩存,會導致數據不一致,主鍵衝突,
- 比如A進入服1;B加入服2;兩個人同時保存了一個對象,這個對象的id都說從應用中區,爲同一個值,再保存到db,將會是相同主鍵
普通屬性的映射
<property name="age"/>
- column:表對應的列,默認是name的值
- access=”field” 該屬性的字段爲public,不需要寫setter和getter
- insert=”false” 該屬性不會出現在insert的sql語句,即添加對象時候,該屬性爲默認值或null
- update=”false” 該屬性不會出現在update的sql語句,即更新對象時候,該屬性不會被改變
- type:列的類型,默認是name的java類型對應的類型.(加粗的是默認類型)
- String =varchar,char,text
- Byte[] =BLOB
- Integer = integer,tinyint,smallint,mediumint
- Long =bigint
- boolean= bit
- float = float
- double =double
- Decimal=bigDecimal
- Date (年月日時分秒) = Date(年月日) 要手動改type爲DateTime(年月日時分秒)
- timeStamp=timestamp
枚舉類映射
- 枚舉類
public enum Sex{
BOY,GIRL;
}
- 屬性
public Sex sex;
- 映射
- org.hibernate.type.EnumType,處理枚舉映射的類
- enumClass=Sex的全限名
- useName=false:通過枚舉實例名獲取;true:通過數組獲取;
- Sex sex=Sex.valueof(“BOY”);
- Sex sex=Sex.values[0];
<property name=sex>
<type name="org.hibernate.type.EnumType">
<param name="enumClass">Sex的全限名</param>
<param name="useName">false</param>
</type>
</property>