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的管理