Я работаю над отдельным приложением spring / jpa / hibernate.
Проблема, с которой я сталкиваюсь, заключается в том, что мое приложение не выполняет откат транзакций, даже если возникла исключительная ситуация RuntimeException.
Вот мой конфиг:
<context:annotation-config />
<context:component-scan base-package="com.jeanbaptistemartin"/>
<context:property-placeholder location="classpath:application.properties"/>
<bean id="gestionnaireMailing" class="com.jeanbaptistemartin.desktop.JFrameGestionnaireMailing" init-method="init" >
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
<property name="shared" value="true"/>
</bean>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.server}"/>
<property name="port" value="${mail.port}"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.connectiontimeout">2000</prop>
<prop key="mail.smtp.timeout">2000</prop>
</props>
</property>
</bean>
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<value>
resource.loader=class
class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
</value>
</property>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="jbmPU" />
<property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="${database.showSql}" />
<property name="generateDdl" value="${database.generateDdl}"/>
<property name="databasePlatform" value="${database.dialect}"/>
</bean>
</property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${database.driver}"/>
<property name="jdbcUrl" value="${database.url}"/>
<property name="user" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="20" />
<property name="idleConnectionTestPeriod" value="3000" />
<property name="loginTimeout" value="300" />
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
Мой транзакционный метод:
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {RuntimeException.class})
public boolean mailAbonne(List<Sculpture> sculpturesChoisiesPourMailing, Abonne abonne) {
try {
for (Sculpture sculpture : sculpturesChoisiesPourMailing) {
MailingAbonnePK mapk = new MailingAbonnePK(sculpture.getSculptureID(), abonne.getAbonneID());
MailingAbonne ma = new MailingAbonne(mapk, new Date());
dao.persistMailingAbonnee(ma);
}
envoyerMail(sculpturesChoisiesPourMailing, abonne);//this method sometimes throws a RuntimeException.
return true;
} catch (RuntimeException e) {
log.error("Exception");
log.error(e);
throw new RuntimeException();
}
}
В моем дао:
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
private EntityManager entityManager;
Теперь немного о текущем поведении моего приложения:
когда envoyerMail вызывает RuntimeException или его подкласс, приложения просто зависают на неопределенное время.
Теперь еще несколько слов о желаемом поведении моего приложения.
Мой метод mailAbonne вызывается в цикле следующим образом:
for (Abonne abonne : totalAbonnes) {
mailAbonne(sculpturesChoisiesPourMailing, abonne);
}
В идеале я хотел бы, чтобы одна итерация цикла не выполнялась или выполнялась атомарно , т. Е. Если RuntimeException вызывается на итерации 3 из общего количества 5 итераций, я бы тогда имел в своей базе данных соответствующие данные до 4-х успешных итераций, и данные, соответствующие неудачной итерации, будут откатываться.
Может кто-нибудь помочь, пожалуйста?
J.