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