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