1. 程式人生 > >初識Hibernate的主配置和映射配置

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

rac 子元素 映射 關聯 ref des ring 用戶 package

Hibernate.cfg.xml 主配置

Hibernate.cfg.xml

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

常用配置查看源碼:

hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties

session-factory 節點: 一般來說一個數據庫對應著一個session-factory節點。

1.數據庫鏈接配置:(以mysql為例子)

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.其他參數的配置

自動建表:

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

    #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>

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