大家好,欢迎来到IT知识分享网。
概述
本文将展示如何使用Spring和Hibernate实现DAO。
从Spring 3.0和Hibernate 3.0.1开始,不再需要Spring HibernateTemplate来管理Hibernate会话。上下文会话将由Hibernate直接管理,并在整个事务范围内处于活动状态。
异常转换
异常转换是HibernateTemplate的职责之一,作用是将低级Hibernate异常转换为更高级的通用Spring异常。
该转换机制可以通过使用@Repository注释DAO来启用和激活。在后台使用了一个Spring bean后处理器,它将向所有@Repository bean提供在Spring上下文中找到PersistenceExceptionTranslator。
异常转换使用代理机制,为了使Spring能够围绕DAO类创建代理,这些代理不能声明为final。
DAO
如下创建一个简单的抽象、参数化DAO,支持常见的泛型操作,可以为每个实体扩展:
public abstract class AbstractHibernateDao<T extends Serializable> { private Class<T> clazz; @Autowired protected SessionFactory sessionFactory; public final void setClazz(final Class<T> clazzToSet) { clazz = Preconditions.checkNotNull(clazzToSet); } // API public T findOne(final long id) { return (T) getCurrentSession().get(clazz, id); } public List<T> findAll() { return getCurrentSession().createQuery("from " + clazz.getName()).list(); } public T create(final T entity) { Preconditions.checkNotNull(entity); getCurrentSession().saveOrUpdate(entity); return entity; } public T update(final T entity) { Preconditions.checkNotNull(entity); return (T) getCurrentSession().merge(entity); } public void delete(final T entity) { Preconditions.checkNotNull(entity); getCurrentSession().delete(entity); } public void deleteById(final long entityId) { final T entity = findOne(entityId); Preconditions.checkState(entity != null); delete(entity); } protected Session getCurrentSession() { return sessionFactory.getCurrentSession(); } }
抽象DAO没有扩展任何Spring模板(如HibernateTemplate),而是直接注入Hibernate SessionFactory到DAO中,并通过获取其上下文Session操作Hibernate API。
构造函数接收实体的Class作为泛型操作中使用的参数。比如操作Foo实体,使用Dao的方式如下:
@Repository public class FooDAO extends AbstractHibernateDAO< Foo > implements IFooDAO{ public FooDAO(){ setClazz(Foo.class ); } }
结论
通过实现一个轻量级的、干净的DAO,几乎没有对Spring的编译时依赖,演示了Hibernate和Spring的持久层的配置和实现。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/94074.html