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的项目,因此应易于导入和运行。

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

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

Spring 3.1和Hibernate的持久层相关推荐

  1. Spring 3.1和JPA的持久层

    1.概述 本教程显示了如何使用Hibernate作为持久性提供程序使用JPA设置Spring . 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 ...

  2. Spring Data JPA的持久层

    1.概述 本文将重点介绍Spring 3.1,JPA和Spring Data的持久层的配置和实现. 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 ...

  3. [Spring Boot 2]整合持久层技术

    持久层技术,简单来说,就是通过操纵对象来操作数据库.(具体见前言部分) 本期博客继续深入Spring Boot技术,值得一提的是,尽管Spring Boot操作起来还是不错的,看都看明白,但还是强烈建 ...

  4. 开源jeecms,jeebbs学习笔记4——从jo_user表看持久层设计

    先看下jo_user这张表. jeebbs采用hibernate作为持久层框架,我们设计一个持久对象PO来映射这张表. PO=POJO+映射配置文件  文件目录如下图所示. 其中UnifiedUser ...

  5. SSH三种框架及表示层、业务层和持久层的理解

    SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) 在项目开发的过程中,有时把整个项目分为三层架构,其中包括: 1.表示层(UI). 2.业务逻辑层(BLL) 3.数 ...

  6. SSH、SSM三种框架及表示层、业务层和持久层的理解

    Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...

  7. JAVA三层架构,持久层,业务层,表现层的理解

    转自:https://blog.csdn.net/ljf_study/article/details/64443653 SSH: Struts(表示层)+Spring(业务层)+Hibernate(持 ...

  8. Java持久层框架之mybatis使用

    一.什么是框架,框架从何而来,为什么使用框架? 框架(framework): 1.是一系列jar包,其本质是对JDK功能的拓展.(jar包,jar:class文件的压缩包) 2.框架是一组程序的集合, ...

  9. Spring –持久层–编写实体并配置Hibernate

    欢迎来到本教程的第二部分. 当您看到本文有多长时间时,请不要惊慌–我向您保证,这主要是简单的POJO和一些生成的代码. 在开始之前,我们需要更新我们的Maven依赖项,因为我们现在将使用Hiberna ...

最新文章

  1. 用python客户画像代码_客户画像与标签体系-Python数据科学技术详解与商业项目实战精讲 - Python学习网...
  2. 【剑指offer-Java版】06重建二叉树
  3. canvas 文字颜色_实现一个canvas小画板
  4. MyBatis 缓存详解-什么时候开启二级缓存?
  5. lighthouse使用_如何在CircleCI中使用Lighthouse
  6. 云栖日报丨收购中天微,阿里芯了解一下!
  7. MySQL for Java的SQL注入测试
  8. opensuse 11.2/11.3安装vmware server 1.0.10笔记
  9. 单片机的C语言中位操作用法
  10. linux未找到 ftp命令,Linux服务器ftp命令找不到
  11. element-ui表格头在分辨率较低的电脑会错乱
  12. 奔驰S400豪华型升级后排电动腿托系统,提升后排乘坐舒适性
  13. php调用shell执行scp,使用shell脚本自动执行scp文件传输
  14. Flashback 技术总结(转贴整理)
  15. vue项目打包部署注意点 + 宝塔面板几步部署项目
  16. 上饶师范学院数学与计算机科学学院,第4章-上饶师范学院数学与计算机科学学院.doc...
  17. java写猴子偷桃问题_猴子偷桃是什么意思
  18. 手机与windows大文件高速传输方法 自用
  19. 微信解封百度春晚红包
  20. c语言程序设计拉丁方阵结构图,C语言实例之拉丁方阵

热门文章

  1. java 用流创建流_成为Java流大师–第1部分:创建流
  2. openjdk 编译_使用OpenJDK 11运行JAXB xjc编译器
  3. 自动化测试特定区域滑动_自动化用户特定实体的访问控制
  4. exec su-exec_WildFly Kubernetes exec探针
  5. lambda ::表达式_Lambda表达式和流API:基本示例
  6. 通过SSL发送的Java邮件
  7. Spring Boot休眠提示
  8. java queue使用_使用Java使用Amazon Simple Queue Service
  9. cobertura覆盖率_Cobertura和Maven:集成和单元测试的代码覆盖率
  10. 与Spring和Maven签订合约优先SOAP服务