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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C排序算法:(二)冒泡排序

冒泡排序就是从左至右比较相邻的两个数值大小&#xff0c;如果右侧的数值较小&#xff0c;则交换两个数值的位置&#xff0c;较大的数值就会像泡泡一样一路向右漂浮。 #include <stdio.h>//small to big void Bubble_Sort(unsigned char *input_data, unsigned int inpu…

C语言之猜数游戏

#include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ srand(time(0)); int count0,thought; int numrand()%1001; printf("%d\n",num); do { printf("请猜这个数在1-100之间\n"); scanf("%d",&thought); cou…

pythonturtle画点的指令_简述python的turtle绘画命令及解释

一 基础认识 turtle库是python的标准库之一&#xff0c;它是一个直观有趣的图形绘制数据库&#xff0c;turtle(海龟&#xff09;图形绘制的概念诞生1969年。它的应用十分广&#xff0c;而且使用简单&#xff0c;只要在编写python程序时写上import turtle即可。 1.绘图窗口设置命…

算法—振兴中华(C语言版)

/* 标题: 振兴中华小明参加了学校的趣味运动会&#xff0c;其中的一个项目是&#xff1a;跳格子。地上画着一些格子&#xff0c;每个格子里写一个字&#xff0c;如下所示&#xff1a;从我做起振我做起振兴做起振兴中起振兴中华比赛时&#xff0c;先站在左上角的写着“从”字的格…

OpenGL ES一些函数详解(一)

glLoadIdentity和glMultMatrix glLoadIdentity的作用是将当前模型视图矩阵转换为单位矩阵&#xff08;行数和列数相同的矩阵&#xff0c;并且矩阵的左上角至右下角的连线上的元素都为1&#xff0c;其它元素都为0&#xff09;&#xff0c;这样可以方便矩阵的乘法运算。 glMultMa…

忽略Java中的自签名证书

我在职业生涯中遇到过几次问题&#xff0c;就是我们有时希望允许自签名证书用于开发或测试目的。 Google的快速搜索显示了多年来无数Java开发人员遇到的麻烦。 根据确切的证书问题&#xff0c;您可能会收到类似以下内容之一的错误&#xff0c;尽管我几乎肯定有其他表现形式&…

C排序算法:(三)插入排序

像打扑克牌一样&#xff0c;每次摸一张牌&#xff0c;把牌插入正确位置。 #include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length) {int i 0, j 0;unsigned char temp 0;for (i 1; i < input_length; i){temp …

sqlserver中自定义函数+存储过程实现批量删除

由于项目的需要&#xff0c;很多模块都要实现批量删除的功能。为了方便模块的调用&#xff0c;把批量删除方法写成自定义函数。直接上代码。 自定义函数&#xff1a; ALTER FUNCTION [dbo].[func_SplitById] (str varchar(50),split varchar(10))--传过来的id字符串 --分割的标…

c语言选择排序_C语言——选择排序

1 选择排序&#xff08;5分&#xff09;题目内容&#xff1a;编写选择排序&#xff0c;要求排序过程调用函数实现&#xff0c;在主函数输入n个数据&#xff0c;调用函数后&#xff0c;输出排好序的元素输入格式:输入整型数n&#xff0c;并输入n个整数&#xff0c;输入数据用空格…

算法—巧排扑克牌(C语言)

/*小明刚上小学&#xff0c;学会了第一个扑克牌“魔术”&#xff0c;到处给人表演。魔术的内容是这样的&#xff1a;他手里握着一叠扑克牌&#xff1a;A&#xff0c;2&#xff0c;....J&#xff0c;Q&#xff0c;K 一共13张。他先自己精心设计它们的顺序&#xff0c;然后正面朝…

LeetCode Binary Tree Paths(简单题)

题意&#xff1a;   给出一个二叉树&#xff0c;输出根到所有叶子节点的路径。 思路&#xff1a; 直接DFS一次&#xff0c;只需要判断是否到达了叶子&#xff0c;是就收集答案。 1 /**2 * Definition for a binary tree node.3 * struct TreeNode {4 * int val;5 * …

我的测试和代码分析工具箱

上周&#xff0c;我们在LINEAS成立了一个“测试技能小组”&#xff0c;该小组用于交换有关测试的知识。 各种各样的问题反复出现的一个问题是&#xff1a;有哪些工具可以测试和分析您的代码&#xff1f; 因此&#xff0c;这是我对此的个人回答&#xff0c;按照我倾向于将其介绍…

新唐M0 KEIL环境搭建,找不到device不识别,关键:Nu-Link_Keil_Driver

公司用新唐的芯片&#xff0c;网上关于新唐的资料相对ST确实少得可怜&#xff0c;搭建环境也是搞了好久&#xff0c;去keil官网下载安装了新唐的pack 打开官方参考工程还是提示找不到device&#xff0c;option里面也没有识别出来。 百度了好久&#xff0c;尝试了各种办法&…

c语言有趣代码_【新课预知】——C语言程序设计

编者按&#xff1a;如今疫情这么严重&#xff0c;为了保护好自己&#xff0c;为了身边的人&#xff0c;大家可一定要听从国家号召——“宅”起来&#xff01;并且&#xff0c;小编们为了让大家伙“宅”得更加健康&#xff0c;可是费了不少脑筋呢&#xff0c;学哉数理公众号首次…

用R语言的quantreg包进行分位数回归

什么是分位数回归 分位数回归(Quantile Regression)是计量经济学的研究前沿方向之一&#xff0c;它利用解释变量的多个分位数&#xff08;例如四分位、十分位、百分位等&#xff09;来得到被解释变量的条件分布的相应的分位数方程。 与传统的OLS只得到均值方程相比&#xff0c;…

算法—快速排序Sqrt (C语言)

/* 快速排序 */ #include"stdio.h" #include"stdlib.h" int compare(const void* a,const void* b) {return (*(int *)a-*(int *)b); }int main() {int i,a[]{32,29,59,8,22,68,89,77},n;nsizeof(a)/sizeof(a[0]);printf("排序前:\n");for(i0;i&…

常规单元测试和存根–测​​试技术4

我的上一个博客是有关测试代码的方法以及讨论您要做和不需要进行测试的方法的一系列博客中的第三篇。 它基于我使用一种非常常见的模式从数据库中检索地址的简单方案&#xff1a; …并且我提出了这样的想法&#xff1a;任何不包含任何逻辑的类都不需要进行单元测试。 在其中&am…

中微CMS32 Keil环境搭建

打开中微官网https://www.mcu.com.cn/Products/113/pids/.html 把这三个资料都下载好。 环境搭建需要用的就是第三个pack包了 坑爹的是pack包下载下来是.zip格式 下载好后需要修改为.pack格式 运行即可。 打开三个资料中的demo code的工程 target和device都能识别出 编…

Windows下sass无法编译

最近windows下使用sass老是出现各种莫名其买的问题&#xff0c;下面是我的一些解决办法 windows下编译sass不支持中文解决办法网上给的是 解决办法&#xff1a; 1.koala可视化编译工具&#xff0c; 找到安装目录里面sass-3.3.7模块下面的engine.rb文件&#xff0c;例如下面路径…

数据库面试中常用的10个问题

1&#xff0e;触发器的作用&#xff1f;答&#xff1a;触发器是一中特殊的存储过程&#xff0c;主要是通过事件来触发而被执行的。它可以强化约束&#xff0c;来维护数据的完整性和一致性&#xff0c;可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如&…