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


只有注册用户登录后才能发表评论。


网站导航: