在整合spring4,hibernate4的时候,在dao层获取session报错:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
代码中的写法是:
然后我上网查了好多资料,大多都说要使用getCurrentSession()方法,要在hibernate里配置:
<prop key="hibernate.current_session_context_class">thread</prop>
加上上面的配置之后运行会报这样的错:
org.hibernate.HibernateException: createCriteria is not valid without active transaction
我上网查了很多关于这个错的原因,大多的都说是dao层没有加上事务的原因,都建议在dao层的实现类上也加上@Transaction这个注解,但是我加上之后还是没用,一点效果都没有
问了好几个群,大多都说是因为service里没有配置上事务造成的,可我service类里确实加上了@Service和@Transaction这两个注解了啊。
也有地方说这样配置:
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>但这样配置之后还是会报没有配置之前的错:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread还有说在web.xml里配置的:
这样配置了之后确实没问题,不过用的是OpenSessionInViewFilter,我不太明白是什么意思?跟getCurrentSession()有什么区别吗?
----------------------------------------分割线----------------------------------------
除了上面的配置,我还试了下面这些配置,均无效,都是报错
让我诧异的一个地方是如果是junit4测试的话,是不会报错的,配置如下:
applicationContext.xml里的事务配置:
service里的配置:
dao里的配置:
junit4测试的时候是没有在dao里配置@Transaction ,也没有在applicationContext.xml里的hibernateProperties里配置hibernate.current_session_context_class属性,但测试就是不报错,控制台也有sql语句输出。
----------------------------------------分割线----------------------------------------
我确实没办法了,希望oschina里的大神来帮忙分析错在哪,能帮忙讲解一下原因,不胜感激。
没有大神吗?怎么没一个人留言呢?唉。。。。伤心啊######我也借用了 ,有点问题,后来重新生成entity,就好了!感谢楼主无私奉献!######楼主解决了没有,我也遇到这问题了,同求解决######AOP 配置是?######现在没有问题了,用aop的配置,不要用声明式的事务,就可以了######我也不知道怎么就好了######同求答案######不要用声明式事务就好了,我现在用的就没问题了######试试在Dao层注入sessionFactory,比如
@Repository public class BaseHibernateImpl extends HibernateDaoSupport implements IBaseHibernate {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFacotry(SessionFactory sessionFacotry) {
super.setSessionFactory(sessionFacotry);
}
}
用currentsession就不要在配置文件里配置thread了
而且现在事务都用注解了,只要配置好包扫描然后加上@Transactional就可以了,配置如下
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
mybatis事务配置:
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
需要导入spring-orm(依赖spring-jdbc)包
######我用的是Spring 4 + Hibernate 5 ,和你版本不一样,答不了 ######<tx:annotation-driven transaction-manager="transactionManager" />
上面这句需要加在DispatcherServlet指定的xml中
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
加在下面的root xml中,会导致在servlet时调用不到事务管理器
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
之所以你用junit可以,是因为junit进来不是经过servlet进来所以你配置在root中的事务管理器能找到。但是普通通过servlet进来的请求,找不到root中的事务管理器,所以需要在DispachServlet指定的xml中配置事务管理器供其使用
######这条回答有用,我分applicationContext.xml与spring-mvc.xml两个配置,将<tx:annotation-driven transaction-manager="transactionManager" />放在applicationContext.xml里面就报这个错,改放在spring-mvc.xml里面就好了。######楼主现在怎么解决的能贴出来嘛?我也遇到这个问题######不要用声明式事务就好了,我现在用的就没问题了######我也和你遇到一样的问题了。。。不知道如何接解决啊~~~版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。