1、问题
执行 entityManager.flush(); 总是报错:javax.persistence.TransactionRequiredException: no transaction is in progress
字面解释是:“没有启动事务”。可是事务是在配置中交给了spring管理了,在方法上加注解 @Transactional就申明了事务的,而且配置中也启动事务注解的扫描:
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>,为何说没有启动事务呢?
2、原因
折腾了很久,分析了很久,也看了一些文章,都没说在关键上,后来有一个文章受到启发,虽然讲的不是我报错的这个问题,但是隐约感觉到问题应该是spring注解管理器和springMVC注解管理器是不同的,他们各自有自己能识别和管理的一堆注解。我的问题出在让springMVC注解管理器扫描了不该他自己管的注解了,例如spring申明式事物相关的注解@Transactional就不该让springMVC来扫描,springMVC注解管理器让他来扫描controller类里面的东西就好了,不要让他来和spring的其他注解掺和。
3、解决
让springMVC的配置xml和spring容器的配置xml分开(虽然让这两个文件分开不是必须的,但是分开是为了看着清爽,也更便于维护)。分开之后,在spring和springMVC各自的xml中配置自己功能相关的东西,不要让springMVC去扫描不该自己管理的那些注解。
3.1 springMVC部分
3.1.1 web.xml 中 springMVC相关部分
<servlet>
<servlet-name>spri