1. 程式人生 > >Hibernate框架學習筆記_Hibernate配置

Hibernate框架學習筆記_Hibernate配置

  • 理解Hibernate配置檔案的作用
  • 掌握Hibernate.cfg.xml檔案
  • 理解對映檔案的作用
  • 持久化類
  • 持久化類的三種狀態

一、hibernate.cfg.xml配置檔案的作用

  • hibernate框架是為了能在各種不同環境下工作而設計的,因此存在大量的配置引數。hibernate.properties配置樣例中有各種配置選項
  • 另一個方法是在hibernate.cfg.xml檔案中指定一套完整的配置。這個檔案可以當成hibernate.properties的替代
  • 若兩個檔案同時存在,XML檔案將覆蓋屬性檔案的設定,即xml檔案是hibernate的預設選擇
  • xml配置檔案啟動hibernate
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Configuration例項被設計為啟動期間物件,一旦SessionFactory建立完成,它就被丟棄了。

二、hibernate配置檔案

2.1、JDBC屬性

connection.driver_class:設定使用的jdbc驅動程式
connection.url:設定jdbc連線字串
connection.username:設定資料庫使用者名稱
connection.password:設定資料庫使用者密碼

2.2、其他屬性

  • hibernate.dialect:一個hibernate Dialect類允許hibernate針對特定的關係資料庫生成優化的sql,當為應用程式的資料庫屬性hibernate.dialect設定正確的org.hibernate.dialect.Dialect的子類,hibernate將為大量的JDBC屬性使用合理的預設值
    SQLServer:org.hibernate.dialect.SQLServerDialect
    MySQL:org.hibernate.dialect.MySQLDialect
    Oracle:org.hibernate.dialect.OracleDialect
  • hibernate.show_sql:輸出所有sql語句到控制檯。ture|false
  • current_session_context_class:指定三種繪畫的上下文相關特性,內建提供了jta | thread | managed 三種實現
  • hibernate.transaction.factory_class:事務管理,有兩種,JDBC | JTA
    hibernate.cfg.xml示例
  • 
    <hibernate-configuration>
        <session-factory name="foo">    
            <property
    name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.username">scott</property> <property name="hibernate.connection.password">tiger</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="show_sql">true</property> <mapping resource="com/it/hibernate/entity/Person.hbm.xml"/> </session-factory> </hibernate-configuration>

    三、實體對映檔案

    物件和關係資料庫之間的對映通常也是用一個XML文件來定義的。這個檔案的作用是確定各個Java物件和資料庫表/檢視對應關係的對映關係(並指定與屬性相對應的列資訊)
    所使用的對映方式以Java類為核心。
    示例:

    <hibernate-mapping package="com.it.hibernate.entity">
        <class name="Person" table="person">
            <id name="pid" type="int" column="pid">
                <generator class="sequence">
                    <param name="sequence">se_per</param>
                </generator>
            </id>
            <property name="pname" type="string"  />
            <property name="pwd" type="string"></property>
    
    
    
        </class>
    </hibernate-mapping>
    
  • DocType:所有的XML對映都要定義示例中的DocType.
  • hibernate-mapping:對映定義的根元素。允許巢狀多個對映,但最好一個持久化類對應一個對映檔案。
    使用class元素定義一個持久化類
    class元素的屬性:
    name:持久化類的(或者介面)的java全限定名。如果這個屬性不存在,hibernate將假定這是一個非POJO的實體對映。
    table:對應的資料庫表名
    subselect:它將一個不可變(immutable)並且只讀的實體對映到一個數據庫的子查詢中。它用於通過SQL語句建立一個檢視代替一張基本表。
    class元素的子元素
    id:被對映的類必須定義對應資料庫表主鍵欄位,為每一個例項包含唯一的標識。
    <id>元素的屬性:
    name:屬性名
    column:主鍵欄位的名字。
    type:標識hibernate型別的名字
    <generator>子元素是一個java類的名字,用來為該持久化類的例項生成唯一標識:用於為long、short或者int型別生成唯一標識,hibernate內建的部分生成器為:
    increment:用於為long、short或int型別生成唯一標識
    identity:對DB2、MySQL、MSSQLServer、Sybase和HypersonicSQL的內建標識欄位提供支援。返回的識別符號是long、short或者int型別的。
    native:根據底層資料庫的能力選擇identity、sequence中的一個
    assigned:讓應用程式在save()之前為物件分配一個識別符號,這是generator元素未指定時的預設生成策略。
    generator子元素示例:
  • //在oracle資料庫中使用序列為記錄生成自增id
    <id name="recordId" column="recordId" type="integer">
        <generator class="sequence">
            <param name="sequence">seq_id</param>
        </generator>
    </id>
    //要求:1、在資料庫中已經建立名為"seq_id"的序列物件
    2、ID屬性的資料型別必須為integer、short或long
    Hinernate在執行插入時,首先會查詢seq_id的nextValue值,然後才會執行記錄的插入操作。

    property:<property>元素為類定義了一個持久化的javabean風格的屬性。

  • 對映型別:
    通過hibernate提供的型別對映可以將java語言中的資料型別對映到SQL資料庫系統的資料型別,這些對映型別幫助將兩種體系中在資料型別進行轉換:
  • <property name="userPassword" column="userPassword" type="string"/>

    hibernate內建的對映型別:
    integer long short float double character bype boolean yes_no true_false:
    這些型別都對應java的原始型別或其封裝類,來符合特定資料庫廠商的SQL欄位型別
    string:從jva.lang.String 到VARCHAR(或者Oracle的VARCHAR2)的對映
    date time timestamp :從java.util.Date和其子類到SQL型別DATE TIME 和TIMESTAMP (或等價型別)的對映
    calender calendar_date:從java.util.Calender到SQL型別 TIMESTAMP和DATE的對映
    big_deciaml big_integer:從BigDecimal和BigIntener到NUMERIC(或者Oracle的NUMBER型別)的對映
    text:把長jva字串對映為SQL的CLOB或者TEXT型別

    四、持久化類

    在應用程式中,用來實現業務問題實體的類,且應遵循POJO(Plain Old Java Obeject)傳統java物件。
    建立對映檔案之前,應該建立一個持久化類。持久化類是指其例項需要被hibernate持久化到資料庫中的類。持久化類通常是域模型中的實體域類。持久化類需符合javabean標準,包含一些屬性,以及與之相對應的setter、getter方法,其中屬性一般修飾為private,方法修飾為public。
    hibernate運用了java的反射機制,將呼叫java.lang.reflect.Constructor.newInstance()方法來構造持久化例項。所有持久化類必須提供一個不帶參的預設構造方法。
    POJO物件:
    - 提供一個無參的構造方法。
    - 提供一個標識屬性(推薦),這個屬性對映資料庫表的主鍵欄位,這個屬性命名、型別高度自由,可是任何原始型別、及其包裝類等。
    - 如果要使用代理來獲得優化效能的選擇,必須使用非final的類
    - 為所有的持久化屬性提供訪問方法(getter、setter)
    持久化類的狀態
    1、瞬時 Transient
    -由new操作符建立,且尚未與hibernate session關聯的物件被認定為瞬時Transient的
    - 瞬時物件不會被持久化到資料庫中,也不會被賦予持久化標識(identifier)
    - 如果程式中沒有保持對瞬時物件的引用,它會被垃圾回收器(Garbage Collection)銷燬
    - 使用hibernate session可以將其變為持久的狀態(persistent)
    hibernate自動執行相應的sql
    2、持久 Persistent
    - 持久的例項在資料庫中有對應的記錄,並擁有一個持久化標識。
    - 持久的例項可能是剛被儲存的,或剛被載入的,無論哪一種,按定義物件都僅在相關聯的session生命週期內的保持這種狀態。
    - hibernate會檢測處於持久狀態的物件的任何改動,在當前操作單元(unit of work)執行完畢時將物件資料(state)與資料庫同步(synchronize)
    - 開發者不需要手動執行update,將物件從持久狀態變成瞬時狀態也不需要手動執行delete語句。
    3、託管 Detached
    - 與持久物件關聯的session被關閉後,物件就變為託管狀態。
    - 對託管物件引用依然有效,物件可繼續被修改
    - 託管物件如果重新關聯到某個新的session上,會再次轉變為持久的。期間的改動將被持久化到資料庫中
    - 託管與持久相互的功能提供一種程式設計模型,即中間會給使用者思考時間的長時間執行的操作單元的程式設計模型。我們稱之為應用程式事務,即從使用者觀點看是一個操作單元(unit or work)
    生命週期狀態轉換:
    這裡寫圖片描述
    將物件持久化
    hibernate認為持久化類通過new方法建立物件是處於瞬時狀態的。我們可將瞬時物件與session關聯,而將這個物件變為持久化狀態。

    User user = new User();
    user.setName("zhang");
    user.setAge(10);
    ...
    session.save(user);

    載入(查詢)持久化物件
    如果使用者知道某個持久化物件的標識(主鍵值),就可以使用session的load()方法來從資料庫中獲取它,load()還有一個引數是指定類的class物件。這個方法會建立指定類的持久化例項,並從資料庫載入其資料。
    如果不確定是否有匹配的行存在,應該使用get()方法,它會立刻訪問資料庫,如果沒有對應的行,會返回null

    User user =(User)session.load(User.class,"param");

    修改持久化類
    -在同一個事務中的持久例項(通過一個session裝載、儲存、建立或者查詢出的物件)被程式碼操作所造成的任何修改都會在(Session被重新整理)flushed的時候被同步修改到資料庫中。
    - 在同一個事務中的持久例項的修改不需要呼叫某個特定的方法對資料庫進行更新。
    - 在一個事務中獲取物件,然後將物件傳送到介面層去操作,最後在一個新的事務儲存所做的修改。這時,hibernate通過提供使用update()方法重新關聯託管例項的方法來支援這種處理模式。
    - 在一個新session中通常第一個呼叫的是update方法,以便保證重新關聯託管物件的操作首先被執行。

    刪除持久化物件
    使用session.delete()會把物件的記錄從資料庫中移除。但是,應用程式中仍然有一個指向已刪除物件的變數。所以,可以理解為,delete的用途是把一個持久化的物件變成瞬時物件。
    session.delete(user);
    注意:對持久化類的的操作(update,get,load,delete)等通常都需要根據在配置檔案中宣告的”id“屬性,所以在執行相關操作之前要確定持久化類的標識屬性是否被正確賦值。

    總結:
    編寫hibernate.cfg.xml檔案
    編寫實體對映檔案entiry.hbm.xml
    hibernate的資料對映型別