Я работаю над модулем импорта, где я читаю из файла 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" />
Как я могу сделать, чтобы решить эту проблему?
И если исключение произойдет, когда я пытаюсь сохранить (MyEntity)? – Skizzo
Поскольку вы находитесь в транзакции, все должно быть отменено. Если это не так, то ваш источник данных, вероятно, не JTA, или ваши таблицы DB не поддерживают транзакции. –