gt;
...
</web-app>
Hibernate和Spring的延迟加载和DAO模式(2)
时间:2011-01-01
使用打开的session的HibernateDAO实现类很简单。实际上,如果你已经使用Spring框架实现Hibernate的DAO对象,最有可能的是,你不
需要做任何改动。DAO必须通过方便的HibernateTemplate工具访问Hibernate,这对数据库访问来说就是小菜一碟。下面是一个DAO的实例。
DAO实例
public class HibernateProductDAO extends HibernateDaoSupport implements ProductDAO {
public Product getProduct(Integer productId) {
return (Product)getHibernateTemplate().load(Product.class, productId);
}
public Integer saveProduct(Product product) {
return (Integer) getHibernateTemplate().save(product);
}
public void updateProduct(Product product) {
getHibernateTemplate().update(product);
}
}
在业务层使用延迟加载
甚至在表现层外,Spring框架也通过AOP******HibernateInterceptor提供了便利的延迟加载支持。hibernate******透明地拦截了配置在
Spring应用上下文中的业务对象的调用,在调用前打开hibernate session,在调用结束时关闭这个session。让我们通过一个简单的例子
来说明。假设我们有一个interface叫做BussinessObject:
public interface BusinessObject {
public void doSomethingThatInvolvesDaos();
}
类BusinessObjectImpl实现了BusinessObject接口:
public class BusinessObjectImpl implements BusinessObject {
public void doSomethingThatInvolvesDaos() {
// lots of logic that calls
// DAO classes Which access
// data objects lazily
}
}
通过Spring上下文的一些配置,我们可以让HibernateInterceptor拦截对BusinessObjectImpl的调用,允许它的方法延迟访问数据对象。
看一下下面的片断:
<beans>
<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="businessObjectTarget" class="com.acompany.BusinessObjectImpl">
<property name="someDAO"><ref bean="someDAO"/></property>
</bean>
<bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"><ref bean="businessObjectTarget"/></property>
<property name="proxyInterfaces">
<value>com.acompany.BusinessObject</value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
</list>
</property>
</bean>
</beans>
当businessObject的实例被引用,HibernateInterceptor打开一个hibernate session并允许对BussinessObjectImpl的调用。当
BusinessOjbectImpl执行完成,HibernateInterceptor透明的关闭这个session。应用代码并不知道任何持 |