使用spring测试框架,我的事务不会回滚,我完全不知道为什么。我花了好几天试图在SO上找到答案,但无济于事,所以我决定发帖。
TESTFILE
@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中的日志。不寻常的是没有提到任何地方的回滚。提到日志创建会话并将数据插入数据库但没有关于回滚的内容。
有人请帮帮我
答案 0 :(得分:1)
将以下注释添加到测试类@TransactionConfiguration(defaultRollback = true)
应该可以解决您的问题。
答案 1 :(得分:0)
您提到AccountDAO
注释了@Repository
注释。你是否也用@Transactional
注释了DAO?没有它,在测试中执行addSmokeEvent()
方法时不会创建任何事务。因此,事件将添加到您的DAO中,但事务管理器无法回滚操作。