1.概述
本文将展示如何使用Spring和Hibernate实现DAO 。 有关核心的Hibernate配置,请参阅有关带有Spring的Hibernate 3和Hibernate 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;@Autowiredprivate 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的项目,因此应易于导入和运行。
翻译自: https://www.javacodegeeks.com/2011/12/persistence-layer-with-spring-31-and.html