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

时间:2009-11-26 06:11:08

标签: java spring jpa

我打电话的时候:

entityManager.flush()

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

我正在使用Hibernate JPA。

13 个答案:

答案 0 :(得分:17)

自己遇到这个问题并花了几个小时试图解决它之后我终于找到了它的理由:Spring有一个bug,如果同一个类有{{@Transactional注释,就无法维护交易1}}自动装配方法的注释。

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

@Service

问题已经消失。

查看此JIRA bug了解详情。

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

最初,我启用了加载时间编织(not notley),读取<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>并简单地删除了第二个属性 - 一切正常(尽管头部敲打了2个小时)。我相信第二个元素与@Configurable类型有关,但可以让其他(更聪明)的人解释差异&amp;为什么一个人会工作&amp;另一个没有..希望这有帮助...

工作定义= <tx:annotation-driven transaction-manager="transactionManager"/>

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

例如:

<input type='text' required>

答案 5 :(得分:2)

我遇到了同样的问题...花了几个小时才终于找到了原因。 在我的案例中,只有一行代码引起了异常......

在我的 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这样的问题。

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

Spring 4.3.1 / Hibernate 4.2.21

我的配置是100%Java代码,没有hibernate或spring xml文档(例如context.xml,persistence.xml等)。问题是EntityManagerFactory我传递给TransactionManager,请参阅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;
}

答案 8 :(得分:0)

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

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

mode可以是代理 aspectj transaction-manager必须指向您的交易管理员。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

对于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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

我最后通过添加

修复了这个错误
<tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" />

进入我的application-context.xml