错误持久化实体列表 - java.lang.IllegalStateException:不允许在共享EntityManager上创建事务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误持久化实体列表 - java.lang.IllegalStateException:不允许在共享EntityManager上创建事务相关的知识,希望对你有一定的参考价值。
我想在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"/>
答案
解决了。
saveTemporaryRecords方法在另一个方法中调用,该方法是从数据库中读取数据(并且没有@Transactional注释)。这搞砸了交易。我从saveTemporaryRecords中删除了@Transactional注释并将其放在调用方法上,它解决了问题。
以上是关于错误持久化实体列表 - java.lang.IllegalStateException:不允许在共享EntityManager上创建事务的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate - 已经持久化的孩子的“分离实体传递给持久化”错误