MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  语源科技BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

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