spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session

代码中的写法是:

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第1张图片

然后我上网查了好多资料,大多都说要使用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这两个注解了啊。

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第2张图片

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第3张图片

也有地方说这样配置:

<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里配置的:

 

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第4张图片

这样配置了之后确实没问题,不过用的是OpenSessionInViewFilter,我不太明白是什么意思?跟getCurrentSession()有什么区别吗?

----------------------------------------分割线----------------------------------------

除了上面的配置,我还试了下面这些配置,均无效,都是报错

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第5张图片

让我诧异的一个地方是如果是junit4测试的话,是不会报错的,配置如下:

applicationContext.xml里的事务配置:

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第6张图片

service里的配置:

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第7张图片

dao里的配置:

spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session_第8张图片

junit4测试的时候是没有在dao里配置@Transaction ,也没有在applicationContext.xml里的hibernateProperties里配置hibernate.current_session_context_class属性,但测试就是不报错,控制台也有sql语句输出。

----------------------------------------分割线----------------------------------------

解决方案:

<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中配置事务管理器供其使用

getCurrentSession()需要在事物环境下才能取得!,通过给controller层配置事物解决;

你可能感兴趣的:(spring4, hibernate4 整合问题Could not obtain transaction-synchronized Session)