JDO、EJB CMP、Hibernate和Amber比較
JDO、EJB CMP、Hibernate和Amber比較
JDO的優(yōu)點(diǎn):
◆JDO的生命周期狀態(tài)機(jī)(lifecycle state machine)是正確的用法。任何其它的O/R映射工具都應(yīng)該使用JDO的生命周期或者它的子集(例如:如果不支持事務(wù))。記住,JDO生命周期是為 JDO實(shí)現(xiàn)服務(wù)的。大部分用戶不需要了解其中很復(fù)雜的內(nèi)幕。網(wǎng)頁(yè)Amber生命周期中有些圖示。
◆PersistentManager API對(duì)如何管理JDO對(duì)象的狀態(tài)有一定的優(yōu)勢(shì)和價(jià)值。
JDO的缺點(diǎn):
◆查詢(query)支持不完全。它應(yīng)該使用類(lèi)似Hibernate的HSQL查詢語(yǔ)言,并使用java.sql.ResultSet作為查詢結(jié)果。
◆用于重載方法的字段擴(kuò)展讓人覺(jué)得比較混亂。最好使用類(lèi)似Hibernate或者EJB/CMP的方法,并重載它們。
Hibernate的優(yōu)點(diǎn):
◆有著正確的數(shù)據(jù)模型。以POJO為基礎(chǔ)的模型是個(gè)正確的方向。
◆可配置性(例如對(duì)象之間的關(guān)系)是個(gè)很好的基礎(chǔ)。
◆HSQL正是O/R映射語(yǔ)言應(yīng)該有的。
◆有著完整的API
◆采用簡(jiǎn)明的Session類(lèi)作為控制流的清洗器,因?yàn)樗赜昧薈onnection的模型
Hibernate的缺點(diǎn):
◆沒(méi)有使用JDO生命周期,這是不正確的做法。
◆API(例如查詢)還是有點(diǎn)混亂。It's better than the alternative, but using java.sql.ResultSet as the foundation would clean it up.
◆API如果作為一個(gè)規(guī)范的話,還是不夠干凈。例如,在使用查詢參數(shù)(query parameters)時(shí),存在一些應(yīng)用漏洞。
◆我不認(rèn)為使用類(lèi)名作為表的標(biāo)識(shí)是件好事。
EJB CMP的優(yōu)點(diǎn):
◆采用工廠類(lèi)(指Home)查找實(shí)例比向Session/Connection對(duì)象傳遞參數(shù)獲取實(shí)例要好。
◆ejbSelect跟上面說(shuō)的類(lèi)似。
◆查詢名稱(chēng)使用abstract schma是一個(gè)很好的解決方案。
◆理論上來(lái)說(shuō),這種模式在某些方案中可以有更好的復(fù)用性。
EJB CMP的優(yōu)點(diǎn):
◆CMP不屬于EJB規(guī)范。它并不是個(gè)合適的模型去實(shí)現(xiàn)這個(gè)目的。已經(jīng)沒(méi)有合適的(例如非官方)借口去讓EJB3.0中保留CMP。
Amber優(yōu)點(diǎn):
◆使用JDBC ResultSet和PreparedStatement做查詢
出于某些原因,O/R映射工具通常拋棄強(qiáng)大的ResultSet和PreparedStatement API,而創(chuàng)建自己一套并不是很合適的替代品。O/R查詢器應(yīng)該使用一個(gè)外部的SQL(例如HSQL)作為查詢語(yǔ)言,并使用ResultSet作為結(jié)果集,使用PreparedStatement處理查詢參數(shù)??梢栽黾悠渌腁PI作為查詢子集,就像查詢一個(gè)單獨(dú)的實(shí)體,但應(yīng)該使用ResultSet和 PreparedStatement作為基礎(chǔ)。
Amber缺點(diǎn):
◆Amber的研究?jī)r(jià)值遠(yuǎn)大于它的使用價(jià)值
【編輯推薦】