2017-11-25 184 views
0

我想使用JPA与Spring MVC持久化实体列表,但收到以下错误。错误持久化实体列表 - java.lang.IllegalStateException:不允许在共享EntityManager上创建事务

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(); 
    } 
} 

调度-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"/> 

回答

0

解决。

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

相关问题