Spring 3.1和Hibernate的持久层
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
Spring 3.1和Hibernate的持久层相关推荐
- Spring 3.1和JPA的持久层
1.概述 本教程显示了如何使用Hibernate作为持久性提供程序使用JPA设置Spring . 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 ...
- Spring Data JPA的持久层
1.概述 本文将重点介绍Spring 3.1,JPA和Spring Data的持久层的配置和实现. 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 ...
- [Spring Boot 2]整合持久层技术
持久层技术,简单来说,就是通过操纵对象来操作数据库.(具体见前言部分) 本期博客继续深入Spring Boot技术,值得一提的是,尽管Spring Boot操作起来还是不错的,看都看明白,但还是强烈建 ...
- 开源jeecms,jeebbs学习笔记4——从jo_user表看持久层设计
先看下jo_user这张表. jeebbs采用hibernate作为持久层框架,我们设计一个持久对象PO来映射这张表. PO=POJO+映射配置文件 文件目录如下图所示. 其中UnifiedUser ...
- SSH三种框架及表示层、业务层和持久层的理解
SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) 在项目开发的过程中,有时把整个项目分为三层架构,其中包括: 1.表示层(UI). 2.业务逻辑层(BLL) 3.数 ...
- SSH、SSM三种框架及表示层、业务层和持久层的理解
Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...
- JAVA三层架构,持久层,业务层,表现层的理解
转自:https://blog.csdn.net/ljf_study/article/details/64443653 SSH: Struts(表示层)+Spring(业务层)+Hibernate(持 ...
- Java持久层框架之mybatis使用
一.什么是框架,框架从何而来,为什么使用框架? 框架(framework): 1.是一系列jar包,其本质是对JDK功能的拓展.(jar包,jar:class文件的压缩包) 2.框架是一组程序的集合, ...
- Spring –持久层–编写实体并配置Hibernate
欢迎来到本教程的第二部分. 当您看到本文有多长时间时,请不要惊慌–我向您保证,这主要是简单的POJO和一些生成的代码. 在开始之前,我们需要更新我们的Maven依赖项,因为我们现在将使用Hiberna ...
最新文章
- 用python客户画像代码_客户画像与标签体系-Python数据科学技术详解与商业项目实战精讲 - Python学习网...
- 【剑指offer-Java版】06重建二叉树
- canvas 文字颜色_实现一个canvas小画板
- MyBatis 缓存详解-什么时候开启二级缓存?
- lighthouse使用_如何在CircleCI中使用Lighthouse
- 云栖日报丨收购中天微,阿里芯了解一下!
- MySQL for Java的SQL注入测试
- opensuse 11.2/11.3安装vmware server 1.0.10笔记
- 单片机的C语言中位操作用法
- linux未找到 ftp命令,Linux服务器ftp命令找不到
- element-ui表格头在分辨率较低的电脑会错乱
- 奔驰S400豪华型升级后排电动腿托系统,提升后排乘坐舒适性
- php调用shell执行scp,使用shell脚本自动执行scp文件传输
- Flashback 技术总结(转贴整理)
- vue项目打包部署注意点 + 宝塔面板几步部署项目
- 上饶师范学院数学与计算机科学学院,第4章-上饶师范学院数学与计算机科学学院.doc...
- java写猴子偷桃问题_猴子偷桃是什么意思
- 手机与windows大文件高速传输方法 自用
- 微信解封百度春晚红包
- c语言程序设计拉丁方阵结构图,C语言实例之拉丁方阵
热门文章
- java 用流创建流_成为Java流大师–第1部分:创建流
- openjdk 编译_使用OpenJDK 11运行JAXB xjc编译器
- 自动化测试特定区域滑动_自动化用户特定实体的访问控制
- exec su-exec_WildFly Kubernetes exec探针
- lambda ::表达式_Lambda表达式和流API:基本示例
- 通过SSL发送的Java邮件
- Spring Boot休眠提示
- java queue使用_使用Java使用Amazon Simple Queue Service
- cobertura覆盖率_Cobertura和Maven:集成和单元测试的代码覆盖率
- 与Spring和Maven签订合约优先SOAP服务