數據訪問對象(DAO)是一種常見的設計模式,並由Sun推薦。但Java DAO最早的例子直接與關係數據庫交互 - 實質上,它們正在進行對象關係映射(ORM)。現在,我看到了像JDO和Hibernate這樣成熟的ORM框架之上的DAO,我想知道這是否是一個好主意。爲什麼將DAO層放在持久層(如JDO或Hibernate)上
我正在開發一個使用JDO作爲持久層的Web服務,並且正在考慮是否引入DAO。
public class Book {
// Book description in various languages, indexed by ISO language codes
private Map<String,BookDescription> descriptions;
}
JDO是足夠聰明的這個映射到「書」和「BOOKDESCRIPTIONS」表之間的外鍵約束:用含有地圖的其他對象的特定類打交道時,我可以預見到的問題。它透明地加載BookDescription對象(使用延遲加載,我相信),並在Book對象持久時持久化它們。如果我要引入一個「數據訪問層」並編寫像BookDao這樣的類,並將所有JDO代碼封裝在其中,那麼這個JDO的透明加載的子對象是否會繞過數據訪問層呢?爲了保持一致性,不應該通過一些BookDescriptionDao對象(或BookDao.loadDescription方法)加載並保存所有的BookDescription對象嗎?然而,以這種方式進行重構會使模型操作變得複雜。
所以我的問題是,在業務層直接調用JDO(或Hibernate,或任何你喜歡的ORM)有什麼問題?它的語法已經非常簡潔,並且與數據存儲無關。將數據封裝在數據訪問對象中的優點是什麼?
謝謝你的答案爲止。我可以看到,在某些情況下,DAO模式可以解決*即時*需求,例如,當您需要專門的代碼來進行對象檢索,錯誤處理等時。但在其他情況下,這更像是理論上的爭論(一個人的「可維護性「是另一個人的」過早抽象「),沒有明確的答案。 – 2009-09-05 14:11:12
爲了給這個問題提供一些背景知識,我對DAO的興趣最初是作爲解決即時問題的手段,即將依賴關係注入到JDO加載的對象中。但是我從那以後發現了我認爲更好的解決方案:JDO的addInstanceLifecycleListener()方法。 – 2009-09-05 14:20:17
幾個月過去了...最後,我最終在JDO之上引入了一個數據訪問層,以便封裝安全方面(限制當前用戶可見或可編輯的實體)。 – 2010-05-19 08:35:52