一、敘述Hibernate應用的主要接口和類


1.1.         Configuration

Configuration類負責管理 Hibernate 的配置信息

包括如下內容:1,Hibernate運行的底層信息:數據庫的URL、用戶名、密碼、JDBC驅動類,數據庫Dialect,數據庫連接池等(對應 hibernate.cfg.xml 文件)。2,持久化類與數據表的映射關係(*.hbm.xml 文件)。

•      

創建Configuration 的兩種方式

1,   屬性文件(hibernate.properties
    Configuration cfg = new Configuration();

2,  Xml文件(hibernate.cfg.xml

a)     加載默認名稱的配置文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();

b)     或加載指定名稱的配置文件:
Configuration cfg = new Configuration()
                           .configure(“myhibernate.cfg.xml”);

1.2.         SessionFactory

Configuration對象根據當前的配置信息生成 SessionFactory 對象。SessionFactory 對象一旦構造完畢,即被賦予特定的配置信息(SessionFactory 對象中保存了當前的數據庫配置信息和所有映射關係以及預定義的SQL語句。同時,SessionFactory還負責維護Hibernate的二級緩存)。 相關代碼如下:

   Configuration cfg =new Configuration().configure();

   SessionFactorysessionFactory = cfg.buildSessionFactory();

 

1, SessionFactory是線程安全的。

2, SessionFactory是生成Session的工廠:
Session session = sessionFactory.openSession();

3, 構造 SessionFactory 很消耗資源,一般情況下一個應用中只初始化一個 SessionFactory 對象。

1.3.         Session

Session是應用程序與數據庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心,所有持久化對象必須在 session 的管理下才可以進行持久化操作。此對象的生命週期很短。Session 中有一個緩存,顯式執行flush()方法之前,所有的持久層操作的數據都緩存在 session 對象處。(相當於 JDBC 中的 Connection)

 

l       持久化類與 Session 關聯起來後就具有了持久化的能力。

l       Session是線程不安全的

l       Session 類的一些方法:

取得持久化對象的方法: get() load()

持久化對象都得保存,更新和刪除:save(),update(),saveOrUpdate(),delete()

開啓事務: beginTransaction().

管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等

1.4.         Transaction

代表一次原子操作,它具有數據庫事務的概念。所有持久層都應該在事務管理下進行,即使是隻讀操作。

 

l      代表一次原子操作,它具有數據庫事務的概念。所有持久層都應該在事務管理下進行,即使是隻讀操作。
Transaction tx = session.beginTransaction();

l       常用方法:

commit():提交相關聯的session實例

rollback():撤銷事務操作

wasCommitted():檢查事務是否提交

1.5.         Query和Criteria接口

都是查詢接口,Query實例包裝了HQL查詢語句,hql是面向對象的,他引用類名及類的屬性名,而不是表名和字段名。Criteria接口完全封裝了基於字符串形式的查詢語句,比Query接口更面向對象,他擅長執行動態查詢。

 

二、敘述Hibernate應用的工作過程

Hibernate的運行過程如下:

1、應用程序先調用Configuration類,該類讀取Hibernate配置文件及映射文件中的信息,

2、並用這些信息生成一個SessionFactory對象,

3、然後從SessionFactory對象生成一個Session對象,

4、並用Session對象生成Transaction對象;

    A、可通過Session對象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法對PO進行加載、保存、更新、刪除、等操作;

    B、在查詢的情況下,可通過Session對象生成一個Query對象,然後利用Query對象執行查詢操作;如果沒有異常,Transaction對象將提交這些操作到數據庫中。

 

三、解釋Hibernate全局配置文件中常用標記的使用

常用hibernate影射配置說明:

節點內容:

<hibernate-mapping schema="dbo" catalog="shopping"        default-cascade="none|all|save-update|delete"

              default-access="property|field|ClassName"

              default-lazy="true|false"

              auto-import="true|false"

              package="package.name">

表1hibernate-mappiing節點參數的說明

參數

描述

必須

schema

數據庫Schema名稱

N

catalog

數據庫catalog名稱

N

default-cascade

默認級聯模式默認是none

N

default-access

默認屬性訪問模式 對於大多數情況採用property即可,這種方式將通過getter/setter方法對影射類屬性進行存取,默認是property

N

default-lazy

數據加載模式。默認是true即延遲加載模式

N

auto-import

在查詢語言中是否可以使用不包含包名的類名爲,true時表示HQL中只需包含類名;爲false時表示HQL必須包含全路徑類名

N

package

本影射文件中影射類的 默認包名,如果有這個屬性那麼在影射文件中我們只需指定類名就可以了

N

1、 class節點定義:

節點內容:

<class name="com.wzq.hibernate.model.Users"

table="users" discriminator-value="1" mutable="true|false"

schema="dbo" catalog="shopping" proxy="ProxyInterface"

dynamic-update="false|true" dynamic-insert="false|true"

select-before-update="false|true" polymorphism="implicit|explicit"

where="arbitrary sql where condition" persister="persisterClass"

batch-size="number" optimistic-lock="none|version|dirty|all"

lazy="false|true" entity-name="entityName">

表2 class節點參數說明

參數

描述

必須

name

類名

Y

table

類對應的表名

N

discriminator-value

子類辨別標識用於多態支持

N

mutable

類是否會發生改變,如果類實例對應的庫表記錄不會發生變化,可將其設爲false,Hibernate在進行髒數據檢查時將忽略此類型數據,從而在一定程度上提升性能。如對應日誌表的影射類,通常日誌操作是單純的Insert操作無須update,因此可以設定爲false

N

schema

數據庫schema

N

catalog

數據庫catalog

N

proxy

代理類接口,代理類的作用是爲延遲加載提供支持

N

dynamic-update

生成update語句時僅包含發生變動的字段,默認值是false即全部字段

N

dynamic-insert

生成insert語句時僅包含非null的字段,默認值是false即全部字段

N

select-before-update

執行update操作時是否先執行一次select以確定數據發生變化之後才進行更新,默認值是false即不執行select

N

polymorphism

多態模式設定

N

where

數據篩選條件如指定where=“location=’shanghai’”之後Hibernate在加載數據時會在生成的sql後自動添加此查詢條件

N

persister

指定持久化實現類,通過指定持久化類,我們可以實現自定義的持久化方法。持久化類爲ClassPersister接口的實現

N

batch-size

指定每次批量操作的數量

N

optimistic-lock

樂觀鎖策略

N

lazy

是否使用延遲加載

N

entity-name

Hibernate3新增特性,用於動態模型(Dynamic Model)支持

N

2、 id節點定義:

節點內容:

<id name="id" type="integer" column="id" unsaved-value="null|none|any|id_value" access="field|property|className">

            <generator class="identity" />

        </id>

 

表3 id節點參數:

參數

描述

必須

name

影射類中對應主鍵的屬性名

N

type

上述屬性的數據類型

 

column

主鍵字段名

N

unsaved-value

對於對象是否已經保存的判定值

N

access

類屬性訪問方式

 

generator

用來描述主鍵的生成方式class指定主鍵的生成類

 

3、 屬性/字段映射配置

映射定義:

        <property name="emailName"

              column="emailName"

              type="string"

              update="true|false"

              insert="true|false"

              formula="arbitrary SQL expression"

              access="field|property|ClassName"

              lazy="true|false"

              not-null="true|false"

              optimistic-lock="true|false">

表4 屬性節點參數:

參數

描述

必須

name

映射類屬性名

 

column

對應數據庫表字段名

N

type

字段類型

N

update

Update操作時是否包含本字段數據

N

insert

Insert操作時是否包含本字段數據

N

formula

爲映射類配置表達式屬性,映射類的屬性並非對應庫表中某個固定字段,而是由庫表中某些字段計算而來,這時可以配置這個屬性,對於配置了formula的屬性而言,並沒有對應的庫表字段存在,也無需指定column;示例:<property name=”sumNum” formula=”num1*num2” type=” big_decimal”/>

 

access

類屬性訪問方式

N

lazy

是否採用延遲加載策略

N

Unique

字段是否唯一

N

not-null

字段是否允許爲空

N

Optimistic-lock

 

N

4、 一對一節點定義:

節點內容:

        <one-to-one name="propertyName"

                class="ClassName"

                cascade="none|all|save-update|delete"

                constrained="false|true"

                outer-join="auto|true|false"

                fetch="join|select"

                property-ref="propertyNameFromAssociatedClass"

                access="property|field|ClassName">

        </one-to-one>

表5 一對一節點屬性:

屬性

描述

必須

name

映射屬性名

Y

class

目標映射類

N

cascade

操作級聯關係:

All:所有情況下均進行級聯操作

None:所有情況均不進行級聯操作

Save-update:在執行save或update時進行級聯操作

Delete:在執行delete時進行級聯操作

N

constrained

約束,表明主控表的主鍵上是否存在一個外鍵對其進行約束,這個選項關係到save、updae等方法的級聯操作順序

N

outer-join

是否使用外連接在hiebernate3中已經將其廢除用fetch替代

N

fetch

Jion等同於outer-join=“true”

Select等同於outer-join=“false”

N

property-ref

關聯類中用於與主控類相關聯的屬性名稱,默認爲關聯類的主鍵屬性名

N

access

屬性值的讀取方式

N

5、 一對多關聯與集合映射

Set節點內容

        <set name="propertyName"

         table="tableName"

         schema="schema_name"

         lazy="false|true"

         inverse="true|false"

         cascade="none|all|save-update|delete|all-delete-orphan"

         sort="unsorted|natural|comparatorClass"

         order-by="column_name asc|desc"

         where="arbitrary sql where condition"

         outer-join="auto|true"

         fetch="join|select"

         batch-size="6"

         access="property|field|ClassName">

         <key column="field_name" />

        <one-to-many class="ClassName" />

         </set>

表6  Set節點屬性說明:

屬性

描述

必須

name

映射屬性

Y

table

目標關聯數據庫表

Y

schema

數據庫的schema名稱

N

lazy

是否採用延遲加載

N

inverse

用於標識雙向關聯中被動方一端

Inverse=false的一方(主控方)負責維護關聯關係默認值爲false

N

cascade

操作級聯

all-delete-orphan:當被關聯對象失去關聯宿主時將其級聯刪除

N

sort

排序類型:

Unsorted:不排序(默認)

Natural:自然排序(避免於order-by搭配使用)

ComparatorClass:指定某個實現了java.util.comparator接口的類作爲排序算法

N

order-by

指定排序字段及其排序方式

N

where

數據篩選條件,如果只需要處理庫表中某些特定數據的時候,可通過此選項設定結果集限定條件

N

outer-join

是否使用外連接

True:總是使用 outer-join

False:不使用outer-join

Auto:如果關聯對象沒有采用proxy機制,則使用outer-join

N

fetch

Fetch=“join”等同於outer-join=“true”

Fetch=“select”等同於outer-join=“false”

N

batch-size

採用延遲加載特性時一次讀入的數據數量

N

sccess

屬性值的讀取方式

N

<key column="field_name" />

 

多方關聯的字段名稱

Y

<one-to-many class="ClassName" />

 

多方的類名

Y

6、 多對一關聯

多對一節點內容:

<many-to-one

        name="createBy"

        column="create_by"

        class="User"

        not-null="true"

        cascade="none|all|save-update|delete"

        update="true|false"

        insert="true|false"

        outer-join="auto|true|false"

        fetch="join|select"

        property-ref="propertyNameFromAssociatedClass"

        access="property|field|ClassName"/>

 

表7 多對一節點屬性說明:

屬性

描述

必須

name

映射屬性

 

column

關聯字段

 

class

類名

默認爲映射屬性所屬類型

 

not-null

此屬性是否爲空

 

cascade

操作級聯關係:

All:所有情況下均進行級聯操作

None:所有情況均不進行級聯操作

Save-update:在執行save或update時進行級聯操作

Delete:在執行delete時進行級聯操作

 

update

Update操作時是否包含本字段數據

 

insert

Insert操作時是否包含本字段數據

 

outer-join

是否使用外連接

True:總是使用 outer-join

False:不使用outer-join

Auto:如果關聯對象沒有采用proxy機制,則使用outer-join

 

fetch

Fetch=“join”等同於outer-join=“true”

Fetch=“select”等同於outer-join=“false”

 

property-ref

關聯類中用於與主控類相關聯的屬性名稱,默認爲關聯類的主鍵屬性名

 

access

屬性值的讀取方式

 

transient、persistent、detached狀態關係圖如下:

 

 

 

  1、transient狀態的特徵:

  * 在數據庫中沒有與之匹配的數據

  * 沒有納入session的管理

  2、persistent狀態的特徵:

  * persistent狀態的對象在數據庫中有與之匹配的數據

  * 納入了session的管理

  * 在清理緩存(髒數據檢查)的時候,會和數據庫同步

  3、detached狀態的特徵:

  * 在數據庫中有與之匹配的數據

  * 沒有納入session的管理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章