原因
必须要将使用
sessionFactory.getCurrentSession()
获取session的代码所在的方法加入到事务管理器中;否则获取不到session
sessionFactory.getCurrentSession()是要基于事务的,才能实现session生命周期的管理
解决
1.添加事务注解
再使用了获取当前session的方法上添加
@Transactional(readOnly=true) 或 只写@Transactional
或者直接在整个service类上加入
需要在spring配置文件中开启 注解模式
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
2.在原有hibernate事务管理的规则配置文件中修改,就是spring的配置文件
寻找类似
<tx:advice id="txAdvice" transaction-manager="transactionManager">
的配置项
可以在配置项中的
<tx:attributes>
<tx:method .......>
这种中找到method后面的name配置 一般都是以某某开头的方法 会有很多,类似于
等等,表示某某开头的方法会被特别注意,这个时候修改你自己方法的名字使之符合这些规则,或者在规则里再开一个你的方法名开头的配置即可。
一般会有一个配套的aop配置在一起,使用切入的方式,统一加入事务的管理。
如果没有写这些配置,建议按照第一种,开启事务注解,然后使用添加注解的形式解决