雖然在04年5月份的畢業設計中使用了Hibernate,不過核心模塊不是自己寫的,所以陌生的部分多過熟悉的.有些東西的理解是需要經過實踐的積累的,不是僅僅依靠看理論材料和寫簡單的測試代碼可以做到的.
A、什么時候使用Hibernate?
Hibernate是業界一個比較成熟的流行的O/R Mapping框架.
說它成熟,因為他提供了一個O/R Mapping產品最主要的功能,比如數據庫映射、連接池管理、事務支持等等,更重要的,它提供了對多中數據庫產品的支持.也許,O/R Mapping和多數據庫支持更能夠吸引開發者的眼球.
說它流行,因為太多的人使用了,不論是從實用開發的角度出發,還是從研究的角度出發,甚至是從趕時髦的角度出發.相對于沒有自己的數據持久層開發能力的開發者角度看,hibernate的確能夠為他們帶來開發效率的提高,改進軟件架構.
那么在什么情況下選擇使用hibernate來構建自己的數據持久層呢?
1、自己沒有數據持久層開發能力
這個當然勿庸置疑了.hibernate提供了一套成熟的模型,能夠在短時間內構建適合業務需求的數據持久層.當然,前提是要對hibernate有基本的使用開發能力.
2、對JDBC底層開發不甚熟悉者.
hibernate封裝了對JDBC底層的調用,統一了對不同類型數據庫系統的支持.在缺乏對JDBC底層調用的了解之前,使用Hibernate可以事半功倍.
3、團隊開發中統一持久層開發.
我們把hibernate稱為O/R Mapping開發框架.既然是框架,那么如果團隊中的成員對這個框架比較熟悉的話,那么可以統一團隊的開發,減少溝通的頻率,促進協同開發.
4、自己開發的數據持久層不能滿足業務需求.
如果缺乏對JDBC的了解和數據持久層開發的經驗,可能自己開發的數據持久層會慢慢的不滿足業務需求.比如在數據緩存、連接池管理、多數據庫支持等等方面.hibernate在上述方面有比較出色的表現,自然在不影響業務開發的前提下可以考慮采用.
5、希望你的產品不依賴于某種特定的數據庫.
B、如何設計適用于多種類型數據庫的通用產品呢?
如果你開發的是一款通用產品,使用了MS-SQL2000數據庫,可能某一天你的客戶會要求你將產品遷移到Oracle,理由很簡單--客戶原來就有購買Oracle數據庫,不希望再增加數據投資了.但是你只能很遺憾的告訴他,你的產品只能使用MS-SQL2000數據庫.無疑,你將可能失去一個重要的準客戶.
那么,如何設計適用于多種類型數據庫的通用產品而不是提供多個產品版本呢?
由于JDBC本身就是數據庫獨立的,即不依賴于具體的數據庫類型.因此,我們可以從以下幾方面進行把握:
1、盡量使用標準通用的SQL語句.
2、盡量上不使用各數據庫方言和某種數據庫特有的函數或者數據類型,盡量通用.
3、將配置參數保存在一個properties文件中.
4、利用Configuration.setProperties(Properties pro)方法載入配置參數文件,而不是采用Configuration.configuration()默認自動載入hibernate.hbm.xml配置文件.
C、選擇合適的獲得JDBC連接方式
假設已經配置了數據庫表映射文件并得到了SessionFactory:
Configuration cfg = new Configuration();
SessionFactory sessionFactory = cfg.buildSessionFactory
在這里我們討論一下三種獲得JDBC連接的方式:
1、用戶自己提供JDBC連接:
java.sql.Connection conn = datasource.getConnection();
Session session = sessionFactory.openSession(conn);
這種方式允許用戶程序自己來管理JDBC連接.不過同一個連接上不能打開兩個并行的session.
2、使用Hibernate默認的JDBC連接方式:
通過一下四種方式設置JDBC連接參數:
a、傳遞一個java.util.Properties到Configuration.setProperties();
b、在classpath目錄提供一個hibernate.properties配置文件;
c、在hibernate.hbm.xml中包含JDBC配置參數;
d、通過java -Dproperty=value指定系統屬性.
之后使用Session session = sessionFactory.openSession()獲取JDBC連接.這個時候所有的hibernate屬性和約束都保存在net.sf.hibernate.cfg.Environment中.
3、使用JNDI獲得JDBC連接:
這個應該可以歸到2上,不過比較特別,獨立出來.
使用JNDI獲得JDBC連接要依賴于Application Server的JNDI特性,不過可以將JDBC的管理交給Application Server去完成.采用這種方法獲得的JDBC自動集成Application Server的容器管理事務的特性.不過如果更換容器之后都需要重新部署容器的JNDI.
D、什么時候POJO需要實現equals和hashCode方法?
當你需要混合使用POJO的時候,比如使用set,必須考慮重載equals和hashCode,特別是在兩個不同的session裝載POJO.Hibernate只在單個session保證JVM鑒別,而且是使用Object默認的equals和hashCode,如果沒有重載equals和hashCode.
在通常情況下,重載equals和hashCode方法,我們會在方法中比較POJO的標識關鍵字.不過,在hibernate中,如果這個POJO還沒有持久化,那么POJO的表示關鍵字是不存在的.所以,我們會采用商業關鍵字相等的原則來判斷兩個POJO是否相等.
E、如何合理利用hibernate提供的數據二級緩存功能:
1、惰性載入機制
2、接口代理機制
3、隱式多態機制
posted on 2005-02-05 14:16
eamoi 閱讀(2586)
評論(2) 編輯 收藏 所屬分類:
Java