1、問題
執行 entityManager.flush(); 總是報錯:javax.persistence.TransactionRequiredException: no transaction is in progress
字面解釋是:“沒有啟動事務”。可是事務是在配置中交給了spring管理了,在方法上加注解 @Transactional就申明了事務的,為何說沒有啟動事務呢。而且配置中也啟動事務注解的掃描了。 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />。
2、原因
3、解決
3.1 springMVC部分
3.1.1 web.xml 中 springMVC相關部分
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.1.2 mvc.xml 文件中關鍵部分
<!-- 開啟springMVC注解支持 -->
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
<!-- 掃描Controller -->
<context:component-scan base-package="org.cj.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
3.2 spring容器部分
spring容器需要掃描的注解,放在別的xml中,讓spring 的Listener去解讀
3.2.1 web.xml 中spring容器關鍵部分
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!--說明: 需要讓spring 容器解讀的配置,放在spring-開頭的xml文件中 -->
/WEB-INF/spring-*.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
3.2.2 spring-core.xml文件關鍵部分
<!-- 自動加載構建bean -->
<context:component-scan base-package="org.cj" />
<!--開啟spring的事務申明注解支持-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />