天天看點

Hibernate技術

基礎知識

    持久層是MODEL層的主要組成部分。是在系統邏輯層面上,專注于實作資料持久化的一個相對獨立的領域。代表着某個系統中的一個邏輯層次,這個層次将資料使用者與資料實體相關聯。

Hibernate是一種“對象—關系型資料映射元件”,根據Object和資料庫存定義,就要以通過映射檔案建立兩者之間的關聯(映射)關系,這也就是所謂的Mapping。映射檔案通常以“.hbm.xml”作為字尾名

    一個Hibernate應用的建立步驟:

1. 建立資料庫。

2. 建構Hibernate基礎代碼,定義關系型資料表與實體類之間的映射關系。

1)      Hibernate基礎代碼包括POJO類和Hibernate映射檔案。

2)      POJO在Hibernate語義中了解為資料庫表所對應的Domain Object,是一個不包含邏輯代碼的值對象(VO),從資料層面上來看,POJO作為資料實體的對象化表現形式,也稱為實體類。

3)      建構Hibernate基礎代碼有以下途徑:

l         手工編寫。根據實體類及表結構的對應關系,按照Hibernate映射規範人工編寫。

l         根據資料庫定義導出表結構,并生成映射檔案和JAVA代碼(推薦)。

l         根據現有的JAVA代碼生成對應的映射檔案,進而将JAVA代碼與資料庫表相綁定。

4)通過Hibernate官方提供的MiddleGen fo Hibernate和Hibernate_Extension工具包,可以從現有資料庫導出表結構,并生成對應的映射檔案和POJO代碼。

3. 完成Hibernate基礎配置。

l         Hibernate配置檔案主要用于配置資料庫連接配接和Hibernate運作時所需用的各種屬性。

l         配置檔案名預設為“Hibernate.cfg.xml”,Hibernate初始化期間會自動在CLASSPATH中尋找這個檔案,并讀取其中的配置資訊,為後期資料庫操作做好準備。

二 基礎語義

1.Configuration類:負責管理Hibernate的配置資訊。Hibernate運作時需要擷取一些義憤實作的基本資訊,其中幾個關鍵屬性包括:

資料庫URL;資料庫使用者;資料庫使用者密碼;資料庫JDBC驅動類;資料庫擴充卡(dialect,用于對特定資料庫提供支援)

l         當調用:Configuration config=new Configuration().configure();時,Hibernate會自動在目前的CLASSPATH中搜尋Hibernate.cfg.xml檔案并将其加載至記憶體中,作為後繼操作的基礎配置。

l         Configuration類一般隻有在擷取SessionFactory時需要涉及,當SessionFactory執行個體建立之後,由于配置資訊已經由Hibernate綁定在傳回的SessionFactory之中,是以一般情況下無需再對其操作。

2.SessionFactory負責建立Session執行個體。可以通過Configuration執行個體建構SessionFactory:

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

SessionFactory sessionFactory=config.buildSessionFactory();

Configuration執行個體config會根據目前的資料庫配置資訊,構造SessionFactory執行個體并傳回。SessionFactory一旦構造完畢,即被賦予特定的配置資訊。

l         SessionFactory構造完畢後,将不再受config的影響。

l         如果應用中通路多個資料庫,則針對每個資料庫應分别為其建立對應的SessionFactory執行個體。

l         SessionFactory中儲存了對應目前資料庫配置的所有映射關系,同時也負責維護目前的二級資料緩存和statement pool。

1. Session:是Hibernate持久化操作的基礎。與傳統意義上的Web層的HttpSession沒有關系。Hibernate Session之與Hibernate,相當于JDBC Connection之與JDBC.

l         Session作為貫穿Hibernate的持久化管理器核心,提供了衆多持久方法如save,update,delete,find等。通過這些方法,可以透明地完成對象的增删改查。非線程安全。

l         Session執行個體由SessionFactory建構:

Session session=sessionFactory.openSession();

之後就可以調用Session所提供的save,get,delete,find等方法完成持久層操作。

l         Hibernate 3中的Session接口取消了find方法,必須通過Query或Criteria接口進行資料查詢,這兩個查詢接口,提供了對查詢條件的封裝機制。

兩者的不同在于,Query面向HQL和Native SQL,而Criteria提供了面向對象的查詢模式。

String hql=”from TUser user wher user.name like ?”;

Query query=session.creatQuery(hql);

三     基礎配置:

四    ORMapping:對象關系映射

通過一個類的操作來代表資料庫中的操作

類中的方法對應SQL語句

Hibernate是一個ORMapping的實作,主要的功能就是以對象的形式操作資料庫.它提供了強大的對象和關系資料庫映射以及查詢功能.使用Hibernate操作資料庫的代碼量很少,使用者像使用對象一樣使用資料庫,所有的操作過程都是通過POJO類完成。

Hibernate開發步驟:

1、持久化類的設計(POJO類,隻包含setter和getter方法的類)

2、持久化類和關系資料庫的映射(HBM映射,描述類和表之間的關系)

3、應用的開發

Hibernate最好的使用方法是使用普通的JAVA對象(POJO)這種程式設計模型來進行持久化。

一個基本的映射檔案形式:

<hibernate-mapping package="POJO類所在的包">

<class name="類的完整路徑" table="資料庫表名">

<id name="id" type="主鍵的類型" column="對應表中的列名">

<generator clsaa="指定主鍵的生成方式">

</id>

<property name="POJO中的屬性名" type="類型" column="對應資料庫表中的列名">

......

</class>

</hibernate-mapping>

hibernate.cfg.xml:對Hibernate環境進行配置,包括使用的資料庫或資料通信源方言(所要使用的資料庫類型)。

POJO類的名稱最好與表名稱一緻,隻是首字母大寫。

在Hibernate中操作資料庫使用Session,可以通過SessionFactory執行個體化。

主鍵生成方式:

assigned:指派

Sequence:自動增長的資料段

uuid.hex:生成一個32位不會重複的主鍵

SessionFactory可以生成Session執行個體,可在多個應用線程中共享,一般情況下,一個應用隻有一個SessionFactory,其中緩存了生成的SQL語句和Hibernate在運作時使用的映射中繼資料。

session不是線程安全的,它代表與資料庫之間的一次操作,它的概念介于Connection和 Transaction(事務)之間。也稱為持久化管理器,與持久化操作有關的一個接口。所有的工作完成後,需要關閉。操作中所使用的Query對 象,Transaction對象都是通過Session取得的

Transaction将應用代碼從底層的事務實作中抽象出,可能是一個JDBC事務,也可能是一個JTA事務,使用Hibernate進行操作(增\删\改)時必須顯示地調用Transaction(預設:autoCommit=false)

五    細粒度模型

細粒度模型就是将原本業務模型中的對象加以細分,得到更多的對象.

對于Hibernate,所謂細粒度模型,主要是針對實體類設計的對象細分。主要有兩個目的:

面向設計的粒度細分:實作更加清晰的系統邏輯

面向性能的性能細分:提高系統的能耗比

對象的細分更多地展現在實體的關聯,對于細分後的類,資料庫中都會有與之對應的表。通過表之間的邏輯組合成為最終的實體對象。

在Hibernate中可以通過Component節點來完成對表的對象的細分。在Hibernate中将某個執行個體的對象中的一個邏輯組成稱為component.它與實體對象的根本差別就在于它沒有辨別(ID),它作為一個邏輯組成,完成從屬于實體對象。

對于表的對象細分,在Hibernate中可以借助Component節點的定義完成。

在Hibernate中将某個執行個體對象中的一個邏輯組成稱為一個Component。它與實體對象的根本差别在于它沒有辨別,它作為一個邏輯組成,完全從屬于實體對象。

基本格式<component name="POJO類名" class="類的完整路徑">

        <property name="屬性名" type="類型" column="對應資料庫表中的列" length="長

         ..........

        </component>

六   Hibernate支援三種類型的繼承形式

Hibernate支援三種類型的繼承形式:

1、表與子類之間的獨立一對一關系。

2、每個子類對應一張子表,并與主類共享主表。

3、表與類的一對多關系。

對于第一種情況:每個子類需要一個映射檔案

對于第二種情況:雖然每個子類各對應一個表,但隻有一個映射檔案,子表與主表的映射關系通過joined-subclass來進行設定。

<joined-subclass name="子類的完整路徑" table=“子類對應的表的名稱”>

</joined-subclass>

對于第三種情況,隻用一張表來完成資訊存儲,通過在資料庫層次上增加一個用以差別不同子類的字段,并在映射檔案中使用discriminator和subclass進行設定即可。

<discriminator column="用以差別不同子類的字段名" type="類型"></discriminator>

<subclass name="子類完整路徑" discriminator-value="對應該子類的字段值">

由于業務的需求,有時會使用多個字段作為複合主鍵

為實作複合組鍵,在POJO類中必須實作Serializable接口,且必須覆寫equals()和hasCode()方法,對于這兩個方法的覆寫,可以使用第三方工具commons-lang-1.0.1.jar

在映射檔案中進行如下配置:

<composite-id>

<key-property name="屬性名1" type="類型1" column="對應資料庫表中的列1" length="長度1">

<key-property name="屬性名2" type="類型2" column="對應資料庫表中的列2" length="長度2">

...........

</composite-id>

Hibernate的基礎配置主要圍繞SessionFactory展開。

1.配置SessionFactory:完成配置檔案和映射檔案加載之後,就得到了一個包含了所有Hibernate運作期參數的Configuration執行個體,通過這個實作,可以建構一個唯一的SessionFactory。

l         資料庫連接配接配置:在Hibernate中,可以設定兩種資料庫通路政策:一種是根據指定的JDBC參數進行資料庫連接配接,由Hibernate來完成連接配接管理過程。另外一種是通過JNDI完成資料庫連接配接擷取。隻可選其一。

l         資料庫連接配接池配置:如果使用JDBC方式通路資料庫,可以為其指定資料庫連接配接池實作,Hibernate支援四種連接配接池元件:預設資料庫連接配接池,C3P0,dbcp,Proxool。

2.事務管理:為了使用Hibernate的Transaction API,必須通過Hibernate.transaction.factory_class屬性指定一個Transaction執行個體工廠類。Transaction API隐藏了義憤的事務機制,允許Transaction API代碼在受管制和非受管制的環境下都可以運作。

l         使用JDBC的事務處理機制。

l         使用JTA

本文轉自yunlielai51CTO部落格,原文連結:http://blog.51cto.com/4925054/1117725,如需轉載請自行聯系原作者