2014-02-17 5 views
0

Я работаю над модулем импорта, где я читаю из файла excel, заполняю сущности и сохраняю их.Tansactional context Spring и Spring-data-jpa

Теперь моя проблема в том, что я работаю со многими объектами, а затем разделяю сохранение на БД тремя различными способами.

Это мой метод импорта:

@Transactional(propagation = Propagation.REQUIRES_NEW) 
private void readRowFromExcel(Row row){ 

    for(Row row : sheet){ 

     Customer customer = readCustomerFromExcel(row) 
     CustomerDeatails customerDetails = readCustomerDetailsFromExcel(row)  

     customerService.save(customer,customerDetails); 

     MyEntity myEntity = readMyEntityFromExcel(row); 

     myEntityService.save(myEntity) 

    } 


} 

Это метод сохранения в обслуживании клиентов

@Transactional(propagation = Propagation.REQUIRED) 
public void save(Customer customer, CustomerDetails customerDetails){ 

      customerRepository.save(customer); 
      customerDatailsRepository.save(customer); 

} 

Это метод сохранения в службе MyEntity:

@Transactional(propagation = Propagation.REQUIRED) 
public void save(MyEntity myEntity){ 

    myEntityRepository.save(myEntity) 

} 

Теперь моя проблема в том, что если я получу исключение в следующей строке кода

MyEntity myEntity = readMyEntityFromExcel (строка);

ПРИМИТИВЫ клиентов и customerDetails уже постоянными, в то время как я должен сохранить только тогда, когда все работает

Моя весна-context.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="${db.driverClass}" /> 
     <property name="url" value="${db.connectionURL}" /> 
     <property name="username" value="${db.username}" /> 
     <property name="password" value="${db.password}" /> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
     p:entityManagerFactory-ref="entityManagerFactory"> 
     <property name="persistenceUnitName" value="myUnit" /> 
    </bean> 

    <!-- 
    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <description>Allow spring to configure hibernate specific settings</description> 
    </bean> 
    --> 
    <bean id="eclipseLinkJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
    </bean> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     p:dataSource-ref="dataSource" 
     p:persistenceUnitName="myUnit" 
     p:jpaVendorAdapter-ref="eclipseLinkJpaVendorAdapter"> 
     <property name="jpaPropertyMap"> 
      <map> 
       <entry key="eclipselink.cache.shared.default" value="false" /> 
       <entry key="eclipselink.weaving" value="false" /> 
      </map> 
     </property> 
     <property name="loadTimeWeaver"> 
      <bean 
       class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
     </property> 
    </bean> 

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

Как я могу сделать, чтобы решить эту проблему?

ответ

0

Решение простое: вы двигаетесь строки, считываемые из первенствует перед любой DB отношении существующих производится:

@Transactional(propagation = Propagation.REQUIRES_NEW) 
private void readRowFromExcel(Row row){ 

    for(Row row : sheet){ 
     //Reading from Excel 
     Customer customer = readCustomerFromExcel(row) 
     CustomerDeatails customerDetails = readCustomerDetailsFromExcel(row); 
     MyEntity myEntity = readMyEntityFromExcel(row); 

     //DB persisting 
     customerService.save(customer,customerDetails); 
     myEntityService.save(myEntity) 
    } 

} 
+0

И если исключение произойдет, когда я пытаюсь сохранить (MyEntity)? – Skizzo

+0

Поскольку вы находитесь в транзакции, все должно быть отменено. Если это не так, то ваш источник данных, вероятно, не JTA, или ваши таблицы DB не поддерживают транзакции. –

Смежные вопросы