Hibernate JPA和Spring javax.persistence.TransactionRequiredException:没有事务正在进行中

我打电话的时候:

entityManager.flush() 

我得到标题中提到的例外。

我正在使用Hibernate JPA。

在我自己遇到这个问题并花了几个小时试图解决它之后我终于找到了它的理由:Spring有一个bug并且如果同一个类具有@Service注释用于自动assembly的方法,则无法使用@Transactional注释维护事务。

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

  

问题消失了。

查看此JIRA错误以获取更多详细信息。

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

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

我的问题与我在上下文定义中设置元素的方式有关 –

最初我启用了加载时间编织(not knownley)读取并简单地删除第二个属性 – 一切正常(耗时2小时)虽然)。 我相信第二个元素与@Configurable类型有关,但可以让其他(更聪明)的人解释差异以及为什么一个会起作用而另一个不起作用。希望这有助于……

working definition =

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

我遇到了这个问题,只需在方法上添加@Transacctional注释,同时在类中添加@Service注释。

例如:

 @Service @Transactional public class MyService { } 

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

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

Spring 4.3.1 / Hibernate 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; } 

我有同样的问题…花了几个小时,直到我终于找到了原因。 在我的案例中,只有一行代码导致exception……

在我的mvc-core-config.xml中 ,以下行是原因:

  

我按照以下方式更改后,一切都恢复了:

  

所以我想我所有的应用程序包而不仅仅是我的@Controller类的扫描导致像@ harshal-waghmare这样的问题在他的post中提到另一个答案 。

确保您的弹簧配置包括以下行:

mode可以是proxyaspectj,transaction-manager必须指向你的事务管理器。

使用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。

我做了以下所有事情。 我的问题是“import”标签,有几个上下文根类似于servlet-context和root-context,它们彼此不相关。 在STS中使用Spring Explorer视图变得清晰。 Tomcat没有JTA。

我的建议是通用的:在您的环境中运行Pet Clinic, 如何在Tomcat中使用Hibernate支持的JPA运行Spring 3.0 PetClinic,或者使用Roo存根应用程序生成,并尝试将您的配置与引用进行比较。

对于JBoss 4.0和Hibernate,我通过向EntityManagerFactoryBean定义添加一些事务管理器属性来修复此问题:

     org.hibernate.transaction.JTATransactionFactory  org.hibernate.transaction.JBossTransactionManagerLookup    

我在这个留言板线程上找到了解决方案。

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

  

进入我的application-context.xml