Hibernate技術

Hibernate是一種“對象關係型數據映射組件”,根據Object和數據庫存定義,就要以通過映射文件建立兩者之間的關聯(映射)關係,這也就是所謂的Mapping。映射文件通常以“.hbm.xml”作爲後綴名
    一個Hibernate應用的創建步驟:
1. 創建數據庫。
2. 構建Hibernate基礎代碼,定義關係型數據表與實體類之間的映射關係。
1)      Hibernate基礎代碼包括POJO類和Hibernate映射文件。
2)      POJOHibernate語義中理解爲數據庫表所對應的Domain Object,是一個不包含邏輯代碼的值對象(VO),從數據層面上來看,POJO作爲數據實體的對象化表現形式,也稱爲實體類。
3)      構建Hibernate基礎代碼有以下途徑:
l         手工編寫。根據實體類及表結構的對應關係,按照Hibernate映射規範人工編寫。
l         根據數據庫定義導出表結構,並生成映射文件和JAVA代碼(推薦)。
l         根據現有的JAVA代碼生成對應的映射文件,從而將JAVA代碼與數據庫表相綁定。
4)通過Hibernate官方提供的MiddleGen fo HibernateHibernate_Extension工具包,可以從現有數據庫導出表結構,並生成對應的映射文件和POJO代碼。
3. 完成Hibernate基礎配置。
l         Hibernate配置文件主要用於配置數據庫連接和Hibernate運行時所需用的各種屬性。
l         配置文件名默認爲“Hibernate.cfg.xml”,Hibernate初始化期間會自動在CLASSPATH中尋找這個文件,並讀取其中的配置信息,爲後期數據庫操作做好準備。
1Configuration類:負責管理Hibernate的配置信息。Hibernate運行時需要獲取一些義憤實現的基本信息,其中幾個關鍵屬性包括:
數據庫URL;數據庫用戶;數據庫用戶密碼;數據庫JDBC驅動類;數據庫適配器(dialect,用於對特定數據庫提供支持)
l         當調用:Configuration config=new Configuration().configure();時,Hibernate會自動在當前的CLASSPATH中搜尋Hibernate.cfg.xml文件並將其加載至內存中,作爲後繼操作的基礎配置。
l         Configuration類一般只有在獲取SessionFactory時需要涉及,當SessionFactory實例創建之後,由於配置信息已經由Hibernate綁定在返回的SessionFactory之中,因此一般情況下無需再對其操作。
2SessionFactory負責創建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構建:
Configuration config=new Configuration().configure();
SessionFactory sessionFactory=config.buildSessionFactory();
Session session=sessionFactory.openSession();
之後就可以調用Session所提供的save,get,delete,find等方法完成持久層操作。
l         Hibernate 3中的Session接口取消了find方法,必須通過QueryCriteria接口進行數據查詢,這兩個查詢接口,提供了對查詢條件的封裝機制。
兩者的不同在於,Query面向HQLNative 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支持四種連接池組件:默認數據庫連接池,C3P0dbcpProxool
2.事務管理:爲了使用HibernateTransaction API,必須通過Hibernate.transaction.factory_class屬性指定一個Transaction實例工廠類。Transaction API隱藏了義憤的事務機制,允許Transaction API代碼在受管制和非受管制的環境下都可以運行。
l         使用JDBC的事務處理機制。
l         使用JTA
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章