【Hibernate】【映射文件】【主鍵+普通屬性+枚舉屬性的映射】

開頭

<?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的值沒用完,會造成該表的主鍵不連續問題
    • 流程:
      1. 在數據中生成一張表格hibernate_sequences:
        • sequence_name表格對應的名
        • next_val,下一次存入緩存的id值
      2. 第一次:讀取employee的當前最大id值
        • 將最大id值+size;存入Hibernate的緩存中,表示當操作時候,累計用到該值時候,去數據庫中的表格hibernate_sequences取next_val
        • 將segment_value存入sequence_name;
        • 將最大id值+size*2;存入next_val;表示下一次存入Hibernate緩存的id值
          1. 非第一次,達到緩存中的值時候,直接去表格hibernate_sequences取next_val.
            這裏寫圖片描述
  • 集成環境

    • 一個服務器的訪問量有限,爲了擴大性能,多個服務器中部署同一個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>
發佈了73 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章