2017-11-25 20 views
0

JPA를 사용하여 Spring MVC와 함께 Entity List를 유지하고 싶지만 다음 오류가 발생합니다.오류 Entity List 오류 - java.lang.IllegalStateException : 공유 EntityManager에서 트랜잭션을 만들 수 없음

java.lang.IllegalStateException는 : 공유의 EntityManager에 거래를 만들 허용되지 않음 - 봄 트랜잭션을 사용하거나 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 주석을 제거하고 호출자 메서드에 저장하면 문제가 해결됩니다.