【问题标题】:Hibernate JPA and Spring javax.persistence.TransactionRequiredException: no transaction is in progressHibernate JPA 和 Spring javax.persistence.TransactionRequiredException:没有正在进行的事务
【发布时间】:2010-12-20 14:02:11
【问题描述】:

当我打电话时:

entityManager.flush()

我得到了标题中提到的异常。

我正在使用 Hibernate JPA。

【问题讨论】:

  • 显示你的 web.xml 和你的 servlets 文件

标签: java spring jpa


【解决方案1】:

在自己遇到这个问题并花了几个小时试图解决它之后,我终于找到了一个原因:Spring有一个错误,如果同一个类有@Service注解,则无法使用@Transactional注解维护事务用于自动装配的方式。

一旦@Service 注释从相关服务类中删除,并且在 XML 配置中声明了适当的 bean:

<bean id="myService" class="com.example.myapp.service.MyServiceImpl" />

问题消失了。

查看JIRA bug了解更多详情。

【讨论】:

  • 好吧,说这是一个错误并不完全正确,您给出的链接已经很好地解释了为什么会发生这种情况 - Service 类在 appContext.xml 和 spring 中都被实例化为 bean- servlet.xml。它应该只在 appContext.xml 中获得“bean”,否则它将没有事务支持。
  • @HarshalWaghmare 你救了我两次。我两次遇到相同的错误,并急切地试图再次找到您的评论:D。最后,加油。告诉 servlet-context 只是为了扫描控制器.. 一切都像魅力一样工作。
【解决方案2】:

确保在执行此语句时您有一个活动事务。如果您使用 JPA,请使用 EntityManager.getTransaction().begin()。这是假设您在 JTA 事务范围之外使用 JPA。

如果您在支持 JTA 的容器内运行应用程序,您还可以使用 JTA UserTransaction 来管理事务。

【讨论】:

  • "不允许在共享 EntityManager 上创建事务 - 改用 Spring 事务或 EJB CMT"
【解决方案3】:

我的问题与我在上下文定义中设置 &lt;tx:annotation-driven/&gt; 元素的方式有关 -

最初我启用了读取&lt;tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/&gt; 的加载时间编织(not knownley),并通过简单地删除第二个属性 - 一切正常(虽然花了 2 个小时的时间)。我相信第二个元素与@Configurable 原型有关,但可以让其他(更聪明的)人解释差异以及为什么一个人可以工作而另一个人不工作。希望这会有所帮助......

工作定义=&lt;tx:annotation-driven transaction-manager="transactionManager"/&gt;

【讨论】:

    【解决方案4】:

    我遇到了这个问题,只需在方法上添加@Transacctional注解,还要在类中与@Service注解一起添加。

    例如:

    @Service
    @Transactional
    public class MyService {
    
    }
    

    【讨论】:

    • 类的@Transactional注解解决了我的问题。
    • 究竟是如何解决问题的?为什么方法上@Transactional不够用?
    【解决方案5】:

    确保在执行此语句时您有一个活动事务。如果您使用 JPA,请使用 EntityManager.getTransaction().begin()。这是假设您在 JTA 事务范围之外使用 JPA。

    【讨论】:

      【解决方案6】:

      春季 4.3.1 / 休眠 4.2.21

      我的配置是 100% Java 代码,没有 hibernate 或 spring xml 文档(例如 context.xml、persistence.xml 等)。问题是我传递给TransactionManagerEntityManagerFactory,请参阅transactionManager 方法中的以下配置。

      @Configuration
      @EnableTransactionManagement
      public class HibernateConfiguration2 {
      
      @Bean
      public DataSource dataSource() {
          return ...; // Build a basic datasource
      }
      
      @Bean
      @Autowired
      public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
          LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
          entityManagerFactory.setDataSource(dataSource);
          entityManagerFactory.setPackagesToScan("nz.co.mark");
          entityManagerFactory.setPersistenceProviderClass(org.hibernate.ejb.HibernatePersistence.class);
      
          return entityManagerFactory;
      }
      
      @Bean
      @Autowired
      public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
          EntityManager em = localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory().createEntityManager();
          em.setFlushMode(FlushModeType.AUTO);
          return em;
      }
      
      @Bean
      @Autowired
      public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) throws Exception {
          JpaTransactionManager transactionManager = new JpaTransactionManager();
          transactionManager.setEntityManagerFactory(emf.getObject());
          // The below line would generate javax.persistence.TransactionRequiredException: no transaction is in progress
          // transactionManager.setEntityManagerFactory(emf.getNativeEntityManagerFactory());
          return transactionManager;
      }
      

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题...花了几个小时才终于找到原因。 在我的情况下,这只是导致异常的一行代码......

        在我的 mvc-core-config.xml 中,原因如下:

        <context:component-scan base-package="com.my.package.application" />
        

        如下更改后,一切都恢复正常了:

        <context:component-scan base-package="com.my.package.application.controller" />
        

        所以我猜想扫描我所有的应用程序包而不仅仅是我的@Controller 类会导致像his post to another answer 中提到的@harshal-waghmare 这样的问题。

        【讨论】:

          【解决方案8】:

          请确保您的处理程序方法声明为public

          @Transactional 
          @RequestMapping('/test')
          public String doTest() {
              // do your stuff here 
              return 'testview';
          }
          

          【讨论】:

            【解决方案9】:

            确保您的 spring 配置包含以下行:

            &lt;tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /&gt;

            mode 可以是 proxyaspectj 并且transaction-manager 必须指向您的事务管理器。

            【讨论】:

              【解决方案10】:

              使用 spring 3.0.0 / 3.0.3 时我也遇到了同样的情况。数据从 JUnit 保存在 MySQL 中,但不是来自 tomcat 服务器。经过这么多工作,我放弃了 JTA 的 RESOURCE_LOCAL。

              这对我有用 http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ 它使用 JTA 并依赖于 JOTM。

              【讨论】:

                【解决方案11】:

                我做了以下所有事情。我的问题是“导入”标签,有几个上下文根,如 servlet-context 和 root-context,它们不相互依赖。 STS 中的 Spring Explorer 视图变得清晰。 Tomcat 没有 JTA。

                我的建议是通用的:在您的环境中运行 Pet Clinic,How to run Spring 3.0 PetClinic in tomcat with Hibernate backed JPA 或使用应用程序的 Roo 存根生成并尝试将您的配置与引用的配置进行比较。

                【讨论】:

                  【解决方案12】:

                  对于 JBoss 4.0 和 Hibernate,我通过在我的 EntityManagerFactoryBean 定义中添加一些事务管理器属性来解决这个问题:

                  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
                      <property name="dataSource" ref="xaDs" />
                      <property name="jpaProperties">
                          <props>
                              <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory
                              </prop>
                              <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup
                              </prop>
                          </props>
                      </property>
                  

                  我找到了解决方案on this message board thread

                  【讨论】:

                    【解决方案13】:

                    我终于通过添加修复了这个错误

                    <tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" />
                    

                    进入我的 application-context.xml

                    【讨论】:

                    • 您的回答与伊恩的回答相矛盾。他删除了 mode="aspectj" 参数。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-05-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-07-29
                    • 1970-01-01
                    相关资源
                    最近更新 更多