Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理

时间:2022-09-26 07:55:21

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

有这么一个测试方法,

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

其中的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的理解不够深入造成的。

Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理的更多相关文章

  1. Java事务管理之Spring&plus;Hibernate

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

  2. Spring管理Hibernate事务

    在没有加入Spring来管理Hibernate事务之前,Hibernate对事务的管理的顺序是: 开始事务 提交事务 关闭事务 这样做的原因是Hibernate对事务默认是手动提交,如果不想手动提交, ...

  3. (转)Hibernate事务管理

    Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...

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

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

  5. &lbrack;原创&rsqb;java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,&period;环境搭建,hibernate&period;cfg&period;xml文件及参数说明,持久化类,对象-关系映射文件&period;hbm&period;xml,Hibernate API &lpar;Configuration 类&comma;SessionFactory 接口&comma;Session 接口&comma;Transaction&lpar;事务&rpar;&rpar;

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

  6. hibernate事务管理 &lpar;jdbc jta&rpar;

    hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...

  7. hibernate中session的管理方式

    package loaderman.c_session; import loaderman.b_second_cache.Dept; import loaderman.b_second_cache.E ...

  8. 声明式事务-整合Spring、Hibernate

    编程式事务:通过编码的方式,让事务处理的代码侵入到核心的业务代码中. 声明式事务:完成了事务处理的代码和业务核心代码的解耦合.提供事务处理代码的复用性和降低维护成本. 声明式事务:aop最典型的应用. ...

  9. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  10. hibernate事务

    hibernate事务 9.3 Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改 ...

随机推荐

  1. 转大写字母-&lpar;ASCII表&rpar;

    #include<stdio.h> /* 转大写,ASCII表.大写与小写相差32 */ char upper(char c) { if(c>='a'&&c<= ...

  2. RESTful API 设计指南【转】

    网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...

  3. CSS3 vmax的用法

    1. calc() calc():在流体布局上,可以通过calc()计算得到元素的宽度. 2. vw/vh/vmin/vmax的使用 vw/vh/vmin/vmax是视窗单位,也是相对单位.相对的不是 ...

  4. &lbrack;原创&rsqb;WB Android客户端架构总结:发WB工作队列设计

    先简单说下需求,发一条WB包含多种类型,例如图片.视频.文字等,发送工作不能阻塞UI,工作队列易于扩展,方便优化. 几个重要的类: JobManager:统一管理Job列表,包括job的添加.启动.终 ...

  5. Navigation包中的move&lowbar;base和amcl实现自动驾驶

    安装功能包: 1.安装导航定位包navigation $ sudo apt-get install ros-indigo-navigation 2.由于导航包在/cmd_val下发布的移动数据加速度会 ...

  6. Sql server数据库连接Oracle库的步骤

    本地使用环境 操作系统: win10 64  ,SQL Server 2012 ,Oracle  Server 11g 第一步:安装好oracle客户端,并配置好TNS信息 ORCL = (DESCR ...

  7. 一台服务器多实例mysql做主从复制

    在一台服务器上开两个端口的mysql(3306.3307),做成主从复制环境 1)安装mysql(安装过程这里就不做过多介绍) 参考:http://www.cnblogs.com/kevingrace ...

  8. Oracle使用exp和imp导出、导入数据

    ===========导出============ exp 用户名/密码@服务器(localhost) file=文件路径.dmp owner=(用户名) ===========导入========= ...

  9. mybatis 为什么要设置jdbcType

    转载自:http://makemyownlife.iteye.com/blog/1610021 前天遇到一个问题 异常显示如下: 引用 Exception in thread "main&q ...

  10. Mongodb添加副本及修改优先级

    Mongodb添加副本及修改优先级 1.添加副本集 #在primary节点上执行 >rs.add( { host: "192.168.1.11:27017", priorit ...