初識Hibernate的主配置和映射配置

Hibernate.cfg.xml 主配置

Hibernate.cfg.xmljava

         主配置文件夾中主要配置:數據庫連接配置,其餘參數配置,映射信息等。mysql

經常使用配置查看源碼:sql

         hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties數據庫

session-factory 節點: 通常來講一個數據庫對應着一個session-factory節點。
服務器

1.數據庫連接配置:(以mysql爲例子)session

      hibernate.properties中的對mysql的配置      ## MySQL

      #hibernate.dialect org.hibernate.dialect.MySQLDialect
      #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
      #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect  //上邊的是哪一個是mysql下的小版本,咱們通常用哪一個第一個就能夠。
      #hibernate.connection.driver_class com.mysql.jdbc.Driver   //驅動配置
      #hibernate.connection.url jdbc:mysql:///test   //連接url配置
      #hibernate.connection.username gavin  //用戶名
      #hibernate.connection.passwor  //密碼併發

        <!-- 表示咱們連接的驅動 ,固然也能夠採用c3p0鏈接池-->
        <property name="hibernate.connection.driver_class">com.jdbc.mysql.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
        <property name="hibernate.connection.username">yujiaming</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 區別不一樣的sql語言,要告訴本數據庫的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>//注意這裏我使用的和上邊的三個版本的編寫略微有所不一樣,這裏 均可以
        <!-- 表示是打印數據庫語句 -->
        <property name="hibernate.show_sql">true</property>

 2.其餘參數的配置oracle

    自動建表:app

    #hibernate.hbm2ddl.auto create-drop 每次在建立sessionFactory時候執行建立表;當調用sesisonFactory的close方法的時候,刪除表!ide

    #hibernate.hbm2ddl.auto create   每次都從新建表; 若是表已經存在就先刪除再建立

    #hibernate.hbm2ddl.auto update  若是表不存在就建立; 表存在就不建立;(咱們通常經常使用這個)

    #hibernate.hbm2ddl.auto validate  (生成環境時候) 執行驗證: 當映射文件的內容與數據庫

 格式化輸出代碼:  <!-- 此處 表示格式化咱們的語句 -->
               <property name="hibernate.format_sql"></property>

 映射文件的配置

根元素:<hibernate-mapping>,每個hbm.xml文件都有惟一的一個根元素,包含一些可選的屬性。

package:表示當前的class默認的包名,能夠不寫可是要在class中寫類的全限定名。

<hibernate-mapping package="cn.hhua.test">

2)schema:數據庫schema的名稱

3)catalog:數據庫catalog的名稱

4)default-cascade:默認的級聯風格,默認爲none

5)default-access:Hibernate用來訪問屬性的策略

6)default-lazy:指定了未明確註明lazy屬性的Java屬性和集合類,Hibernate會採起什麼樣的默認加載風格,默認爲true

7)auto-import:指定咱們是否能夠在查詢語言中使用非全限定的類名,默認爲true,若是項目中有兩個同名的持久化類,則最好在這兩個類的對應的映射文件中配置爲false

    說白的 若是設置爲false 在hql查詢語句中要指明返回類的全限定名。默認便可。

<class>定義類:根元素的子元素,用以定義一個持久化類與數據表的映射關係,以下是該元素包含的一些可選的屬性

注意class其實有好多的屬性能夠設置,這裏咱們只說開發中會遇到的

1)name:持久化類(或者接口)的Java全限定名,若是這個屬性不存在,則Hibernate將假定這是一個非POJO的實體映射

    說白了就是咱們要映射的類

2)table:對應數據庫表名

<class table="employee" name="Employee"> //這倆最經常使用,其餘的不怎麼用

3)discriminator-value:默認和類名同樣,一個用於區分不一樣的子類的值,在多態行爲時使用

4)dynamic-update:指定用於UPDATE的SQL將會在運行時動態生成,而且只更新那些改變過的字段

5)dynamic-insert:指定用於INSERT的SQL將會在執行時動態生成,而且只包含那些非空值字段

6)select-before-update:指定HIbernate除非肯定對象真正被修改了(若是該值爲true),不然不會執行SQL UPDATE操做。在特定場合(實際上,它只在一個瞬時對象關聯到一個新的Session中時執行的update()中生效),這說明Hibernate會在UPDATE以前執行一次額外的SQL SELECT操做,來決定是否應該執行UPDATE

7)where:指定定個附加的SQLWHERE條件,在抓取這個類的對象時會增長這個條件

8)optimistic-lock:樂觀鎖定,決定樂觀鎖定的策略

9)lazy:經過設置lazy="false",全部的延遲加載(Lazy fetching)功能將未被激活(disabled)

<id>定義主鍵

1)name:表示映射類的id屬性

2)type:類型 可使java的類型也能夠是hibernate的類型

3)column:數據庫中主鍵的字段名字

4)unsaved-value:用來標誌該實例是剛剛建立的,還沒有保存。能夠用來區分對象的狀態

5)class:Hibernate用來訪問屬性值的策略

主鍵的生成策略

                   identity  自增加(mysql,db2)

                   sequence  自增加(序列), oracle中自增加是以序列方法實現

                   native  自增加【會根據底層數據庫自增加的方式選擇identity或sequence】

                           若是是mysql數據庫, 採用的自增加方式是identity

                           若是是oracle數據庫, 使用sequence序列的方式實現自增加

                  

                   increment  自增加(會有併發訪問的問題,通常在服務器集羣環境使用會存在問題。)

                  

                   assigned  指定主鍵生成策略爲手動指定主鍵的值

                   uuid      指定uuid隨機生成的惟一的值

                   foreign   (外鍵的方式, one-to-one講)

 

 

 

 

 

 

 

 

 

 

單個字段做爲主鍵的實例:

    <id name="empId" column="id">
            <generator class="native" />
     </id>

<property>普通字段的配置

主要的屬性有:

        name  指定對象的屬性名稱

                column 指定對象屬性對應的表的字段名稱,若是不寫默認與對象屬性一致。

                length 指定字符的長度, 默認爲255

                type   指定映射表的字段的類型,若是不指定會匹配屬性的類型

                           java類型:     必須寫全名

                     hibernate類型:  直接寫類型,都是小寫。

例如:

      <property name="empName" column="empName" type="java.lang.String" length="20"></property>
        <property name="workDate" type="java.util.Date"></property>
        <!-- 若是列名稱爲數據庫關鍵字,須要用反引號或改列名。 -->
        <property name="desc" column="`desc`" type="java.lang.String"></property>//desc是一個關鍵字,用於排序

其餘經常使用(瞭解即便可):

lazy:指定實例變量第一次被訪問時,這個屬性是否延遲抓取,默認爲false。

unique:使用DDL爲該字段添加惟一的約束,此外,這也能夠用作property-ref的目標屬性。

not-null:使用DDL爲該字段添加能否爲空的約束。

access:Hibernate用來訪問屬性值的策略。

access屬性用來讓你控制Hibernate如何在運行時訪問屬性。默認狀況下,Hibernate會使用屬性的get/set方法對。若是你指明access="field",則Hibernate會忽略get/set方法對,直接使用反射來訪問成員變量。

 

<composite-id>複合主鍵

複合主鍵其實就是一組字段例如(姓名+地址)組合成的主鍵

使用步驟:

           1. 咱們要定義一個主鍵的類,而後將其中的主鍵組成字段定義成類的屬性(咱們以地址和姓名爲主鍵爲例)

// 複合主鍵類
public class CompositeKeys implements Serializable{
    private String userName;
    private String address;
   // .. get/set
}

//--------------------------------------------------
//咱們在具體的類中只須要引用主鍵就能夠
public class User {

    // 名字跟地址,不會重複
    private CompositeKeys keys;
    private int age;
}

           2.配置符合主鍵的映射關係

    <!-- 複合主鍵映射 -->
        <composite-id name="keys">
            <key-property name="userName" type="string"></key-property>
            <key-property name="address" type="string"></key-property>
        </composite-id>
相關文章
相關標籤/搜索