由于对SSH还停留在比较初级的应用水平上,今天在遇到一个疑惑时折腾了很久,具体问题是这样的,

有这么一个测试方法,

1     public static void test1() {
2         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml","daoContext.xml");
3         MgrManager mgr = (MgrManager)ctx.getBean("mgrManager");
4         List<EmpBean> emps = mgr.getEmpsByMgr("weblogic");
5         for (EmpBean empBean : emps) {
6             System.out.println(empBean.getEmpName());
7         }
8     }

其中的MgrManager是一个业务类, 提供一个根据名字查询员工的功能, 以上方法执行完全没有问题,

然后又有下面这个测试方法,

    public static void test2() {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml","daoContext.xml");EmployeeDao empDao = (EmployeeDao)ctx.getBean("employeeDao");Employee emp = empDao.findByName("oracle");System.out.println(emp.getSalary());}

test1是使用业务类间接得查询数据库,得到结果,而test2是通过dao直接查询数据库, 但是test2始终报错说没有数据库session。

百思不得其解,按理说所有的bean是通过spring管理的,既然spring为业务类注入了sessionFactory, 为何dao类就没有呢?

然后通过手工在test2中写了如下代码,发现是可以通过测试的,

    public static void test3() {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml","daoContext.xml");SessionFactory sf = (SessionFactory)ctx.getBean("sessionFactory");Session session = sf.openSession();List<Employee> emps = session.createQuery("select e from Employee e where e.name = 'oracle'").list();}

也就是说,问题不在于Spring容器中没有sessionFactory, 而是sessionFactory没有被open!那为什么test1的例子中的sessionFaction又open了呢?

看了配置文件半天,发现有这么关键的一行配置,

<aop:pointcut id="leePointcut" expression="bean(empManager)||bean(mgrManager))" />

另外,通过面向切面编程原理,Spring通过AOP机制为dao对象的数据操作提供事务管理,有如下配置,

<tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 配置详细的事务语义 --><tx:attributes><!-- 所有以get开头的方法是只读的 --><tx:method name="get*" read-only="true" /><!-- 其他方法使用默认设置 --><tx:method name="*" /></tx:attributes>
</tx:advice>
<aop:config>
<!-- 配置一个切入点,用来匹配empManager和mgrManager两个Bean的所有方法的执行 -->
<aop:pointcut id="leePointcut" expression="bean(empManager)||bean(mgrManager)||bean(employeeDao)" />
<!-- 指定在leePointcut切入点应用txAdvice事务增强 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="leePointcut" />
</aop:config>

而下面这段配置是用来配置真正的事务管理类, 正是通过上面的切面配置, 将业务类与增强处理关联起来, 同时通过下面的事务管理类进行事务管理

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"p:sessionFactory-ref="sessionFactory" />

那么重点就在上面的transactionManager这个bean了, 通过查询资料,初步了解到, HibernateTransactionManager这个类提供 sessionFactory的管理,为了实现数据同步,在HibernateTransactionManager内部会进行Hibernate session的open和close,并将打开的Hibernaate sesion关联到当前的Application session,在Application中则通过getCurrentSession方式获取争取的打开的Hibernate session,  从而解决某些方面的线程安全及同步问题。

由此可见,由于上面配置事务管理的切面类仅仅只是针对了业务类,即默认情况下只有业务类才用于打开的session, 由此可以理解上面的test2为什么报“没有打开的session”错误了。

针对上面的配置, 我做了如下修改,

<bean id="TestManager" class="service.impl.TestManagerImpl" p:empDao-ref="employeeDao"/>

果然修改之后test2就能正常执行了。

以上仅仅涉及非常非常小的问题, 主要还是对HibernateTransactionManager的理解不够深入造成的。

转载于:https://www.cnblogs.com/fysola/p/6719800.html

Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理相关推荐

  1. Session会话管理

    会话管理 Web会话管理概述 常见的Web应用会话管理方式 基于Server端的Session的管理方式 基于Cookie的Session的管理方式 Cookie与Session最大的区别 Cooki ...

  2. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopalliance org.asp ...

  3. java hibernate详细_Java事务管理学习之Hibernate详细介绍

    hibernate是jdbc轻量级的封装,本身不具备事务管理的能力,在事物管理层面,一般是委托于底层的jdbc和jta来完成调度的.下面这篇文章主要给大家介绍了Java事务管理学习之Hibernate ...

  4. 【大话Hibernate】hibernate事务管理

    事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰. 数据库向用户提供保存当前程序状态的方法,叫事 ...

  5. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Hibernate事务管理

    事务只是一个工作单位(单元). 在这种情况下,如果一个步骤失败,则整个事务失败(称为原子性). ACID属性(原子性,一致性,隔离性和持久性)可以描述事务. Hibernate中的事务接口 在hibe ...

  7. (转)Hibernate事务管理

    http://blog.csdn.net/yerenyuan_pku/article/details/70650239 事务介绍 什么是事务? 事务就是逻辑上的一组操作,组成这组操作的各个单元要么全部 ...

  8. spring 中 Hibernate 事务和JDBC事务嵌套问题

    http://www.iteye.com/topic/11063?page=2 ---mixed ORM and JDBC usage is a feature of Spring DAO 这是Rod ...

  9. (转载)spring配置hibernate 事务。

    Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作 ...

  10. Hibernate 事务总结

    2019独角兽企业重金招聘Python工程师标准>>> 一.事务的定义 1.物理上的数据库事务 2.逻辑上事务与persistence context有关 3.应用程序上的事务指的是 ...

最新文章

  1. leetcode-344-反转字符串
  2. java垃圾回收机制(简述)
  3. 洛谷P7515:矩阵游戏(差分约束)
  4. 不招聘数据科学家的 7 个理由!
  5. Git学习系列(三)版本回退和管理文件的修改及删除操作
  6. 将公司的主要项目从eclipse迁移到android studio for mac环境(1)
  7. 微信小程序单指拖拽和双指缩放旋转
  8. 悉尼大学高级计算机专业世界排名,悉尼大学专业排名一览及最强专业推荐(QS世界大学排名)...
  9. 电子元件-电感、磁珠
  10. 磁共振线圈分类_磁共振检查的线圈选择
  11. 【Mysql】InnoDB 中的 B+ 树索引
  12. 俞敏洪一分钟励志演讲稿
  13. Python PAT乙级 1068 万绿丛中一点红 (20分) 成功
  14. 在一台电脑上如何安装两个JDK,并实现自由切换
  15. 怎么控制使用计算机的时间吗,谁知道如何限制电脑使用时间
  16. 2021山丹一中高考成绩查询,2019年张掖中考分数线,张掖中考录取分数线(出炉)
  17. 如何做好网站的日常优化推广
  18. 关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解
  19. LWIP的RAW API UDP通信详解(stm32f103---enc28j60)
  20. CF104C-Cthulhu

热门文章

  1. Redis基础知识之—— hset 和hsetnx 的区别
  2. 文本挖掘之文本相似度判定
  3. 获取Docker中容器的信息
  4. 华为2013校园招聘上机笔试题
  5. KMP子串匹配算法(Knuth–Morris–Pratt algorithm)
  6. pci驱动与硬件通信
  7. 命令2-Create Project Tree
  8. ccna学习笔记之五:路由器密码恢复
  9. docsify and awesome
  10. linear model课程笔记