转载请注明原文地址: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();
}
}

Hibernate学习笔记四:事务管理的更多相关文章

  1. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  2. Hibernate学习笔记四 查询

    HQL语法 1.基本语法 String hql = " from com.yyb.domain.Customer ";//完整写法 String hql2 = " fro ...

  3. Hibernate学习笔记四

    1 整合log4j(了解) l slf4j 核心jar  : slf4j-api-1.6.1.jar .slf4j是日志框架,将其他优秀的日志第三方进行整合. l 整合导入jar包 log4j 核心包 ...

  4. kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  5. 四 Hibernate的一级缓存&事务管理及其配置

    持久态对象: 自动更新数据库,原理是一级缓存. 缓存:是一种优化的方式,将数据存入内存,从缓存/内存中获取,不用通过存储源 Hibernate框架中提供了优化手段:缓存,抓取策略 Hibernate中 ...

  6. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  7. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  8. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  9. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

随机推荐

  1. UITableView加载网络数据的优化

    UITableView加载网络数据的优化 效果 源码 https://github.com/YouXianMing/Animations // // TableViewLoadDataControll ...

  2. Java Date 时分秒置0

    Date now = new Date(); Calendar cal1 = Calendar.getInstance(); cal1.setTime(now); // 将时分秒,毫秒域清零 cal1 ...

  3. PostgreSQL入门,PostgreSQL和mysql

    PostgreSQL被誉为“世界上功能最强大的开源数据库”,是以加州大学伯克利分校计算机系开发的POSTGRES 4.2为基础的对象关系型数据库管理系统. PostgreSQL支持大部分 SQL标准并 ...

  4. Unit Testing of Spring MVC Controllers: Configuration

    Original Link: http://www.petrikainulainen.net/programming/spring-framework/unit-testing-of-spring-m ...

  5. 不用中间变量交换两个数 swap(a,b);

    #include <iostream> using namespace std; int main () { ; ; cout<<"a="<<a ...

  6. [leetcode]Unique Binary Search Trees @ Python

    原题地址:https://oj.leetcode.com/problems/unique-binary-search-trees/ 题意: Given n, how many structurally ...

  7. Unique Paths II leetcode java

    题目: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. H ...

  8. Create an Android library

    官方文档 创建 Android 库 [Create an Android library] Android 库在结构上与 Android app module 相同.它可以提供构建应用所需的一切内容, ...

  9. PHP操作数据库函数比较

    常用的php语法连接mysql如下 <?php $link = mysql_connect('localhost', 'user', 'password'); mysql_select_db(' ...

  10. SearchBySql

    Java: public List<Accountingdisclosure> searchAccountingdisclosuresBySql(String sqlStr)throws ...