Spring 3.1和Hibernate的持久层

1.概述

本文将展示如何使用Spring和Hibernate实现DAO 。 有关核心的Hibernate配置,请参阅有关带​​有Spring的Hibernate 3Hibernate 4的文章。

2.没有更多的春天模板

从Spring 3.0和Hibernate 3.0.1开始, 不再需要Spring HibernateTemplate来管理Hibernate Session。 现在可以使用上下文会话 - 由Hibernate直接管理并在整个事务范围内处于活动状态的会话

因此,现在的最佳实践是直接使用Hibernate API而不是HibernateTemplate ,这将有效地将DAO层实现与Spring完全脱钩。

2.1。 没有HibernateTemplate的异常翻译-活得很好

异常转换是HibernateTemplate的职责之一–将低级别的Hibernate异常转换为更高级别的通用Spring异常。

如果没有模板, 该机制仍处于启用状态,并积极为所有对@Repository注解的DAO的。 在幕后,它使用了一个Spring bean后处理器,该处理器将为所有@Repository bean和在Spring上下文中找到的所有PersistenceExceptionTranslator提供建议。

要记住的一件事是,异常翻译是通过代理完成的。 为了使Spring能够围绕DAO类创建代理,不得将它们声明为final

2.2。 没有模板的Hibernate会话管理

当Hibernate对上下文会话的支持问世时, HibernateTemplate本质上已经过时了。 实际上,该类的javadoc已使用以下建议进行了更新(原始文本为粗体):

注意:从Hibernate 3.0.1开始,事务性Hibernate访问代码也可以采用普通的Hibernate样式进行编码。 因此,对于新启动的项目,请考虑采用基于{@link org.hibernate.SessionFactory#getCurrentSession()}的标准Hibernate3样式编码数据访问对象。

3. DAO

我们将从基本的DAO开始- 一个抽象的,参数化的DAO ,它支持常见的通用操作,并且打算针对每个实体进行扩展:

public abstract class AbstractHibernateDAO< T extends Serializable >{
   private Class< T > clazz;

   @Autowired
   private SessionFactory sessionFactory;

   public void setClazz( final Class< T > clazzToSet ){
      clazz = clazzToSet;
   }

   public T findOne( final long id ){
      return (T) getCurrentSession().get( clazz, id );
   }
   public List< T > findAll(){
      return getCurrentSession()
       .createQuery( "from " + clazz.getName() ).list();
   }

   public void save( final T entity ){
      getCurrentSession().persist( entity );
   }

   public T update( final T entity ){
      return (T) getCurrentSession().merge( entity );
   }

   public void delete( final T entity ){
      getCurrentSession().delete( entity );
   }
   public void deleteById( final long id ){
      final T entity = findOne( id);
      delete( entity );
   }

   protected final Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

这里有几个方面很有趣–如所讨论的,抽象DAO不会扩展任何Spring模板(例如HibernateTemplate )。 而是将Hibernate SessionFactory直接注入DAO中,并通过它公开的上下文Session扮演主要Hibernate API的角色:

this.sessionFactory。 getCurrentSession ();

另外,请注意,实体的Class是在构造函数中传递的,以便在通用操作中使用。

现在,让我们看一下Foo实体的DAO的示例实现

@Repository
public class FooDAO extends AbstractHibernateDAO< Foo > implements IFooDAO{

   public FooDAO(){
      setClazz(Foo.class );
   }
}

4。结论

本文介绍了基于XML和Java的配置以及Hibernate和Spring 3.1持久层的配置和实现。

讨论了不再依赖DAO层模板的原因,以及配置Spring以管理事务和Hibernate Session的可能的陷阱。 最终结果是一个轻量级的,干净的DAO实现,几乎没有依赖Spring的编译时。

这个简单项目的实现可以在github项目中找到–这是一个基于Eclipse的项目,因此应易于导入和运行。

参考:来自BCG的 JCG合作伙伴 Eugen Paraschiv的Spring 3和Hibernate的DAO

翻译自: https://www.javacodegeeks.com/2011/12/persistence-layer-with-spring-31-and.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值