Hibernate是一個開放源代碼的對象關系映射框架它對JDBC進行了非常輕量級的對象封裝使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫Hibernate可以應用在任何使用JDBC的場合既可以在Java的客戶端程序使用也可以在Servlet/JSP的Web應用中使用最具革命意義的是Hibernate可以在應用EJB的JEE架構中取代CMP完成數據持久化的重任
Hibernate的核心接口一共有個分別為SessionSessionFactoryTransactionQuery和Configuration這個核心接口在任何開發中都會用到通過這些接口不僅可以對持久化對象進行存取還能夠進行事務控制下面對這五的核心接口分別加以介紹
·Session接口Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流包含了很多常見的SQL語句)但需要注意的是Session對象是非線程安全的同時Hibernate的session不同於JSP應用中的HttpSession這裡當使用session這個術語時其實指的是Hibernate中的session而以後會將HttpSesion對象稱為用戶session
·SessionFactory接口SessionFactroy接口負責初始化Hibernate它充當數據存儲源的代理並負責創建Session對象這裡用到了工廠模式需要注意的是SessionFactory並不是輕量級的因為一般情況下一個項目通常只需要一個SessionFactory就夠當需要操作多個數據庫時可以為每個數據庫指定一個SessionFactory
·Configuration接口Configuration接口負責配置並啟動Hibernate創建SessionFactory對象在Hibernate的啟動的過程中Configuration類的實例首先定位映射文檔位置讀取配置然後創建SessionFac
·Transaction接口Transaction接口負責事務相關的操作它是可選的開發人員也可以設計編寫自己的底層事務處理代碼
·Query和Criteria接口Query和Criteria接口負責執行各種數據庫查詢它可以使用HQL語言或SQL語句兩種表達方式
Hibernate主鍵介紹
Assigned
Assigned方式由程序生成主鍵值並且要在save()之前指定否則會拋出異常特點主鍵的生成值完全由用戶決定與底層數據庫無關用戶需要維護主鍵值在調用sessionsave()之前要指定主鍵值
Hilo
Hilo使用高低位算法生成主鍵高低位算法使用一個高位值和一個低位值然後把算法得到的兩個值拼接起來作為數據庫中的唯一主鍵Hilo方式需要額外的數據庫表和字段提供高位值來源默認請況下使用的表是hibernate_unique_key默認字段叫作next_hinext_hi必須有一條記錄否則會出現錯誤
特點需要額外的數據庫表的支持能保證同一個數據庫中主鍵的唯一性但不能保證多個數據庫之間主鍵的唯一性Hilo主鍵生成方式由Hibernate 維護所以Hilo方式與底層數據庫無關但不應該手動修改hi/lo算法使用的表的值否則會引起主鍵重復的異常
Increment
Increment方式對主鍵值采取自動增長的方式生成新的主鍵值但要求底層數據庫的支持Sequence如OracleDB等需要在映射文件xxxhbmxml中加入Increment標志符的設置
特點由Hibernate本身維護適用於所有的數據庫不適合多進程並發更新數據庫適合單一進程訪問數據庫不能用於群集環境
Identity
Identity當時根據底層數據庫來支持自動增長不同的數據庫用不同的主鍵增長方式
特點與底層數據庫有關要求數據庫支持Identity如MySQl中是auto_increment SQL Server 中是Identity支持的數據庫有MySqlSQL ServerDBSybase和HypersonicSQL Identity無需Hibernate和用戶的干涉使用較為方便但不便於在不同的數據庫之間移植程序
Sequence
Sequence需要底層數據庫支持Sequence方式例如Oracle數據庫等特點需要底層數據庫的支持序列支持序列的數據庫有DBPostgreSqlQracleSAPDb等在不同數據庫之間移植程序特別從支持序列的數據庫移植到不支持序列的數據庫需要修改配置文件
Native
Native主鍵生成方式會根據不同的底層數據庫自動選擇IdentitySequenceHilo主鍵生成方式特點根據不同的底層數據庫采用不同的主鍵生成方式由於Hibernate會根據底層數據庫采用不同的映射方式因此便於程序移植項目中如果用到多個數據庫時可以使用這種方式
UUID
UUID使用位UUID算法生成主鍵能夠保證網絡環境下的主鍵唯一性也就能夠保證在不同數據庫及不同服務器下主鍵的唯一性
特點能夠保證數據庫中的主鍵唯一性生成的主鍵占用比較多的存貯空間
Foreign GUID
Foreign用於一對一關系中GUID主鍵生成方式使用了一種特殊算法保證生成主鍵的唯一性支持SQL Server和MySQL
Hibernate源碼中幾個包的作用簡要介紹
netsfhibernate*
該包的類基本上都是接口類和異常類
netsfhibernatecache*
JCS的實現類
netsfhibernatecfg*
配置文件讀取類
llection*
Hibernate集合接口實現類例如ListSetBag等等Hibernate之所以要自行編寫集合接口實現類是為了支持lazy loading
nnection*
幾個數據庫連接池的Provider
netsfhibernatedialect*
支持多種數據庫特性每個Dialect實現類代表一種數據庫描述了該數據庫支持的數據類型和其它特點例如是否有AutoIncrement是否有Sequence是否有分頁sql等等
netsfhibernateeg*
Hibernate文檔中用到的例子
netsfhibernateengine*
這個包的類作用比較散
netsfhibernateexpression*
HQL支持的表達式
netsfhibernatehq*
HQL實現
netsfhibernateid*
ID生成器
netsfhibernateimpl*
最核心的包一些重要接口的實現類如果SessionSessionFactoryQuery等
netsfhibernatejca*
JCA支持把Session包裝為支持JCA的接口實現類
netsfhibernatejmx*
我不懂JMX只知道JMX是用來編寫App Server的管理程序的大概是JMX部分接口的實現使得App Server可以通過JMX接口管理Hibernate
netsfhibernateloader*
也是很核心的包主要是生成sql語句的
netsfhibernatelob*
Blob和Clob支持
netsfhibernatemapping*
hbm文件的屬性實現
tadata*
PO的Meta實現
netsfhibernateodmg*
ODMG是一個ORM標准這個包是ODMG標准的實現類
netsfhibernatepersister*
核心包實現持久對象和表之間的映射
netsfhibernateproxy*
Proxy和Lazy Loading支持
netsfhibernateps*
該包是PreparedStatment Cache
netsfhibernatesql*
生成JDBC sql語句的包
netsfhibernatetest*
測試類你可以用junit來測試Hibernate
netsfhibernatetoolhbmddl*
用hbm配置文件生成DDL
netsfhibernatetransaction*
Hibernate Transaction實現類
netsfhibernatetype*
Hibernate中定義的持久對象的屬性的數據類型
netsfhibernateutil*
一些工具類作用比較散
netsfhibernatexml*
XML數據綁定
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28253.html