Hibernate学习笔记四:事务管理
2024-10-16 09:36:22
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6768298.html
一:需要事务的Session操作
Session操作中,查询类操作是不需要事务就能生效的,如get、query等。
而save、update、delete等操作,则需要提交事务才能生效。
二:DAO层事务管理的缺点
DAO层主要负责数据的持久化操作,因此,也是session操作的主要位置。我们一般在DAO层针对一个表定义增删查改操作的方法,一个方法一个功能。因此,如果在DAO进行事务管理的话,就要每个方法 开启事务——session操作——提交事务——关闭session,这会产生大量重复代码,并且不灵活,如:懒加载(var=session.load(POJO))时,查询变量var在被调用时,才会触发SQL语句进行数据库查询,而在此之前session不能被关闭。如果这个变量被发布出去,如:return到service层,那我们只能在service层关闭session了,这样又要考虑session的传递问题,十分麻烦。
三:一般的事务管理策略
在service中定义事务,是最正确的方式。因为一个service层方法对应着一个业务,一个业务中可能有多个数据操作,因此我们“以业务为单位进行事务管理”。
四:懒加载事务管理
用懒加载查询得到的变量,如果发布到了其他层使用,那么事务管理、session关闭都要随之迁移。既然如此,我们干脆就在“唯一入口和出口”处进行事务管理与session的开启关闭,那就是——Filter。
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Transaction tx = null;
try {
Session session = HibernateSessionFactory.getSession();
tx = session.beginTransaction();
chain.doFilter(request, response);//传递进去,经历各层处理、View层响应
tx.commit();
} catch (Exception e) {
if (tx!=null&tx.isActive()) {//如果Transcation依旧存在,即系出现异常,回滚事务
tx.rollback();
}
} finally{
session.close();
}
}
最新文章
- AjaxHelper简介
- 【转载】Serif和Sans-serif字体的区别
- php基础31:正则匹配-元字符
- MySQL CAST与CONVERT 函数的用法
- Android判断用户是平板还是手机的方法
- node场景
- HTML5 canvas 绘制五星红旗
- CLR_Via_C#事件
- 在myeclipse下安装svn插件,出现了Could not generate DH keypair,这么一个错误。
- python自动化运维:系统基础信息模块
- Gradle 1.12用户指南翻译——第五十二章. Maven 插件
- DS博客作业01—日期抽象数据类型设计与实现
- vue-cli利用router创建单页面
- C# yield return 和 yield break
- cache2go - cachetable源码分析
- .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
- DLC 格雷码
- oracle查看列数据类型
- WorldWind源码剖析系列:视景体类Frustum
- Linux——进程管理简单学习笔记(二)
热门文章
- linux中解压rar文件
- [wxWidgets]_[0基础]_[不常见但有用的类wxStandardPaths]
- C++MFC编程笔记day05 文档类-单文档和多文档应用程序
- 抢票季:吐槽12306 &; 分享抢票经验
- Asp.Net Core获取当前上下文对象
- 直方图与bin
- 解决tensorflow在训练的时候权重是nan问题
- RxJava【变换】操作符 map flatMap concatMap buffer MD
- 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言
- jQuery实现锚点跳转(就一行代码)