Hibernate——對象/數據庫映射

關係數據庫學最重要的一個理論就是:不要給關鍵字賦予任何業務意義。由於只要賦予了業務意義,就有可能發生改變,將會爲之後的數據庫維護形成很是大的開銷。 java

 

一、hibernate應用步驟 sql

    在java應用中,使用hibernate包括4步: 數據庫

    1)建立hibernate配置文件:hibernate-configuartion app

    2)建立實體類 分佈式

    3)建立對象/關係映射文件:hibernate-mapping 函數

    4)使用hibernate API編寫訪問數據庫代碼 spa

 

    1.1 建立hibernate配置文件 hibernate

    hibernate配置文件有兩種格式,一種是properties格式,一種是xml格式。hibernate配置文件放置在java應用的classpath中。 xml

    1.2 建立實體類 對象

     建立的實體類要符合javaBean規範;hibernate不要求實體類必定要實現Serializable接口,可是若是採用分佈式結構,java類要在不一樣進程間傳遞,須要要求實現該接口;hibernate要求持久化類必須實現一個帶空參數的構造函數。

  

二、hibernate關係映射

    2.1 訪問級別

    Java應用程序不能訪問private類型的getXXX()和setXXX()方法,可是hibernate沒有此限制,它可以訪問任何訪問級別的getXXX()和setXXX()方法。

    2.2 基本類型屬性和包裝類型屬性

    hibernate既支持包裝類型(如Long,Integer),也支持基本類型。對於持久化類的OID,推薦使用包裝類型。這樣能夠經過持久化類的OID是否爲空,判斷持久化類的狀態。

    2.3 hibernate訪問持久化類屬性的策略

    在<property>元素中的access屬性用於指定hibernate訪問持久化類的屬性的策略,有兩個值:

    1)property:默認值。須要有相應的set方法和get方法。

    2)field:當沒有set方法或者get方法時指定該值,讓hibernate直接訪問屬性。

    2.4 在持久化類的訪問方法中加入程序邏輯

    1)在get方法和set方法中加入程序邏輯

        例子:

        public class Customer{

            private String firstName;

            private String lastName;

            public Customer(){

            }

            public String getName(){

               return firstName + 「 「 + lastName;

            }

            public void setName(String name){

               StringTokenizer toker =  new StringTokenizer(name);

               firstName= toker.nextToken();

               lastName = toker.nextToken();

            }

        }

   

        create table Customer(

            id long not null primary key,

            name varchar(100) not null

        )

  在以上的例子中,Customer類只有firstName和lastName屬性,沒有name屬性,而數據庫中只有name字段。因此在 hibernate-mapping中應該使用<property name=」name」 column=」name」/>進行映射。而且在HQL語句中,只能用name做爲查詢條件,而不能firstName和lastName做爲查詢 條件。

 

   2)控制insert語句和update語句

   <property>和<class>元素中的屬性能夠控制insert語句和update語句,主要包括:

   a)<property>中的insert:默認爲true,若是爲false,在生成的insert語句中不包含該字段,代表該字段永遠不能爲插入。

   b)<property>中的update:默認爲true,若是爲false,在生成的update語句中不包含該字段,代表該字段永遠不能爲更新。

   c)<class>中的mutable:默認爲true,若是爲false,默認全部<property>中的update爲false。

   d)<property>中的dynamic-insert:默認爲false。若是爲true,只有當該字段值不爲null,纔會把他包含在自動生成的insert語句中。

   e)<property>中的dynamic-update:默認爲false。若是爲true,只有當該字段值不爲null,纔會把它包含在生成的update語句中。

   f)<class>中的dynamic-insert:默認爲false。

   g)<class>中的dynamic-update:默認爲false

    hibernate生成動態sql的開銷很小,因此若是表中包含不少字段,建議將dynamic-insert和dynamic-update字段都設置爲true,減小數據庫執行sql語句的開銷。
相關文章
相關標籤/搜索