在一個單獨的DAO中混合使用Hibernate 和 JDBC
Posted on 2009-12-18 16:51 leekiang 閱讀(1000) 評論(0) 編輯 收藏 所屬分類: hibernate 、jdbc、事務、并發Hibernate 的確通過 PersistentEnum 接口提供了對標準化 的支持,這使得我們的域對象實現了一個與 ShippingCompany 對象非常類似的結構。然而,我們可能對將域對象與某個特定的持久化實現過于耦合持保守態度。如果我們計劃長期使用 Hibernate ,這可能并不是一個太大的問題,但是請謹慎考慮這個決策。如果我們使用 ibatis ,那么我們就完全沒那么幸運了;它完全不支持標準化。謝天謝地,如果我們的 ORM 導致過耦合或者完全沒有這方面的支持,還有個解決方案——使用 JDBC 。
有 Spring 的支持,使用 JDBC 變得如此簡單,我們不會再因為它的復雜性而將其的優先級打個折扣。可是,如果我們選擇使用某個特定的 ORM 工具,那么我們就很難用基于 JDBC 的 DAO 實現進行替換了——目前我們就是這樣。當我們同時在一個類中包含了 JDBC 和 hibernate 代碼時,我們就無法使用 Spring 提供的支持。因為我們的 DAO 只能擴展 HibernateDaoSupport 或 JdbcDaoSupport 二者之一。幸運的是,這里有一個優雅的解決方案,它允許我們將 Hibernate 和 JDBC 代碼封裝在同一個類之內,而不會因此失去 Spring 的支持。這個方案的關鍵在于將 JDBC 代碼封裝在內部類中,之后將主體 DAO 的調用委托給這個內部類去完成。代碼清單 11-6 提供了一個示例:
代碼清單 11-16. 在一個單獨的 DAO 中混合使用 Hibernate 和 JDBC
package com.apress.prospring.ch11.canonicalization;
?
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
?
public class MyDao extends HibernateDaoSupport {
?
?? private MyJdbcDao innerDao;
?
?? public MyDao() {
????? innerDao = new MyJdbcDao();
?? }
?
?? public void update(MyDomainObject obj) {
????? // use Hibernate to persist the data
?? }
?
?? public MyDomainObject getById(int someId) {
????? return innerDao.getBy(someId);
?? }
?
?? private static class MyJdbcDao extends JdbcDaoSupport {
?
????? public MyDomainObject getBy(int someId) {
???????? // do some real processing
???????? return null;
????? }
?? }
}
?
盡管這只是一個簡單的實現,我們也可以從中得到啟發。所有的 JDBC 相關代碼都被轉移到一個內部類中,而此內部類擴展了 JdbcDaoSupport , 所有的 Hibernate 相關功能都留在外部,外部類仍然是 HibernateDaoSupport . 的子類。通過這個類,我們可以使用 Hibernate 完成域對象的持久化,但是我們可以將查詢功能交給嵌入的 JDBC DAO 去完成。
在我們的應用中有效利用標準化 ,可以通過避免大量無謂對象的創建,從而極大提升內存使用效率。如果我們必須更新標準化對象相關的數據,同時我們在 DAO 中使用了 ORM 框架,那么我們就可以以 ORM 無關的形式引入一些 JDBC 代碼來加入標準化 支持。
來源:Pro Spring中文版 http://book.csdn.net/bookfiles/48/100481407.shtml
http://hi.baidu.com/%D3%F4%C3%C6%BB%A8%C9%FA%BD%B4/blog/item/7768d41e8c06ceffe0fe0ba6.html