Транзакция Spring Test не откатывается

Используя среду весеннего тестирования, мои транзакции не откатываются, и я совершенно не понимаю, почему. Я провел несколько дней, пытаясь найти ответы на SO, но безрезультатно, поэтому решил опубликовать.

Тестовый файл

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContextTest.xml")
@Transactional
public class joinTest {

@Autowired
private DAO AccountDAO;//My DAO is annotated with @Repository


@Before
public void beforeMethod()
{
    //log4j append code
}

@Test
public void saveMethod()
 {
    Account acct = new Account();
    acct.setUsername("USER");
    SmokeEvent evt = new SmokeEvent();
    evt.setDateSmoked(new DateTime());
    evt.setAccount(acct);
    AccountDAO.addSmokeEvent(evt);
    }
}

applicationContext.xml

<context:component-scan base-package="com.abstinence.Logic"/>
<context:annotation-config/>


<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:hsql://82.165.173.127/testdb"/>
    <property name="username" value="SA"/>
    <property name="password" value=""/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.abstinence.Logic"/>
    <property name="hibernateProperties">
        <props>
            <prop key ="dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="javax.persistence.validation.mode">none</prop>
        </props>
    </property>
</bean>

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="hibernateDAOOperation" expression="execution(* com.abstinence.Logic.AccountDAO.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="hibernateDAOOperation"/>
</aop:config>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

Я проверил журналы из log4j. Необычно то, что нигде нет упоминания об откате. В журналах упоминается создание сеанса и вставка данных в базу данных, но ничего об откате.

Кто-нибудь, пожалуйста, помогите мне


person zam    schedule 27.12.2013    source источник
comment
Попробуйте добавить transactionManager docs.spring. io/spring/docs/3.2.x/spring-framework-reference/   -  person Evgeni Dimitrov    schedule 27.12.2013
comment
Нам нужна дополнительная информация: какую версию Spring вы используете? Какая аннотация @Transactional это (спринг)? Что выводит журнал, когда регистратор для org.springframework.test.context установлен на DEBUG? Чем занимается ваш DAO? Вызывает ли он getCurrentSession() (правильно) или openSession() (неправильно) на SessionFactory?   -  person Sam Brannen    schedule 28.12.2013
comment
Вы очень умный человек, раз заметили, что я использовал не Spring @Transactional, а J2EE. Изменил его на spring, и транзакция успешно откатилась. Я довольно небрежный разработчик. Спасибо большое за Ваш комментарий. Я рад отправить вам немного биткойнов за ваши усилия.   -  person zam    schedule 28.12.2013


Ответы (2)


Добавление следующей аннотации к вашему тестовому классу @TransactionConfiguration(defaultRollback = true) должно решить вашу проблему.

person BugInTheCode    schedule 13.04.2015
comment
из Spring5 @TransactionConfiguration (defaultRollback = true) устарел - person Rishabh Agarwal; 03.12.2018

Вы упомянули, что AccountDAO снабжен аннотацией @Repository. Вы также аннотировали DAO с помощью @Transactional? Без него не будет создана транзакция при выполнении метода addSmokeEvent() в тесте. Следовательно, событие будет добавлено в ваш DAO, но менеджер транзакций не сможет откатить операцию.

person matsev    schedule 27.12.2013