错误持久化实体列表 - java.lang.IllegalStateException:不允许在共享EntityManager上创建事务

问题描述 投票:0回答:1

我想在Spring MVC中使用JPA持久保存实体列表但收到以下错误。

java.lang.IllegalStateException:不允许在共享的EntityManager上创建事务 - 使用Spring事务或EJB CMT代替

我试着谷歌搜索答案,但无法解决我的情况。

这是我的服务实现的方法。

@Override
@Transactional
public void saveTemporaryRecords(List<TemporaryRecord> temporaryRecords) {

    for (TemporaryRecord temporaryRecord : temporaryRecords) {

        try {
            temporaryRecordDao.persist(temporaryRecord);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

temporaryRecordDao接口及其实现没有任何方法,它们使用以下方法扩展AbstractDao实现:

@PersistenceContext
protected EntityManager em;

@Override
public void persist(Entity entity) throws Exception {

    if (entity == null) {
        throw new Exception("Entity is null");
    }

    try {
        em.persist(entity);
    } catch (Exception ex) {
        ex.getMessage();
        em.getTransaction().rollback();
        em.close();
    }
}

dispatcher-servlet.xml具有以下相关配置:

<!-- Configure Entity Manager -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
            p:dataSource-ref="dataSource"
            p:packagesToScan="hu.beczdev.webbudgetapp.model">

    <property name="jpaVendorAdapter">
        <bean id="jpaVendorAdapter"
            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
            p:databasePlatform="org.hibernate.dialect.MySQL5Dialect" p:showSql="true" />
    </property>
</bean>

<!-- Configure TransactionManager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
jpa transactions illegalstateexception
1个回答
0
投票

解决了。

saveTemporaryRecords方法在另一个方法中调用,该方法是从数据库中读取数据(并且没有@Transactional注释)。这搞砸了交易。我从saveTemporaryRecords中删除了@Transactional注释并将其放在调用方法上,它解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.