wangyu1221 2011-06-20 09:38
浏览 516
已采纳

getCurrentSession()获得的sessoin不受Spring的事务管理?这个问题困扰了我好几天。

之前项目里没有spring,一切正常,dao里用到的session都是通过sessionFactory.getCurrentSession()获得的,手工启动事务,filter统一提交或回滚。
说明hibernate的配置没有问题。

然后引入了spring。

spring的配置里的hibernate是这么初始化的,应该也无问题


<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>


然后声明式事务管理
引用
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="systemService" expression="execution(* com.orm.system.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="systemService"/>
</aop:config>


Dao都是继承自HibernateDaoSupport,接受spring注入的sessionFactory实例。切面是配置在service层的,service的方法里调用dao的方法。

问题出来了。

在任何一个Dao里面
如果使用this.getSession()则session正常关闭,调用多次也没问题。
如果使用this.getHibernateTemplate().getSessionFactory().getCurrentSession(),始终打开1个session并且不能关闭。

我觉得如果使用this.getSession()正常,所以事务配置应该是没有问题的。
而且有一点,如果是通过getCurrentSession()获得的session必须要beginTransaction,不然报错,而this.getSession()则不用。

后来我配置了OpenSessionInViewFilter,发现这里打开和关闭的session和dao里面this.getSession()获得的session是同一个,而getCurrentSession()获得的不是同一个,
this.getSession().getTransaction().isActive() = true,
getCurrentSession().getTransaction().isActive() = false,

说明getCurrentSession()获得的session并不在事务管理里。

我看了很多东西,一些是说getCurrentSession()在spring的事务管理,一些是说通过调用spring创建的sessionFactory的getCurrentSession()方法获得的session在spring的事务管理(难道还有不通过spring创建的sessionFactory?)。我做了一些测试,结果表明自始至终sessionFactory都只有一个实例。


所以我得出结论,虽然sessionFactory受spring管理,但是直接从sessionFactory获取的session(不管是openSession还是getCurrentSession)不受spring的事务管理,是原生的Hibernate session。

不知道我这样理解是否有问题,还是我哪里做错了得出了错误的结果?
问题补充
没有人研究过这个问题?还是太新手了不屑回答啊?
  • 写回答

5条回答 默认 最新

  • lanmoshui1020 2011-06-20 12:52
    关注

    不需要配置,在applicationContext.xml里配spring的sessionFactory,会强行这么做。只要注意[b]别[/b]在hibernate的设置中加

    SessionHolder 你关注一下Spring里这个类。这个是从OSIV开始,到后面currentSession()都会用到的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿