【发布时间】:2010-07-12 20:21:31
【问题描述】:
我使用的是 Spring 3 和 Hibernate 3.5,我没有让我的事务在测试环境中回滚,这让我担心它们也不会在生产环境中回滚。
测试类:
@ContextConfiguration(loader = MyConfigurationLoader.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class DashTemplateRepositoryTest extends AbstractMulitpleDataSourceSpringContextTests {
@Autowired
DashTemplateRepository dashTemplateRepository;
@Test
public void testSaveCategory() {
int initialCount = getCategoryCount();
Category c = new Category();
c.setName("mynewcategory");
dashTemplateRepository.save(c);
assertEquals(initialCount + 1, getCategoryCount());
}
}
扩展自定义类:
public abstract class AbstractTransactionalTemplateTests extends AbstractTransactionalJUnit4SpringContextTests {
protected SimpleJdbcTemplate simpleJdbcTemplate;
@Autowired
DashTemplateRepository dashTemplateRepository;
@Resource(name = "dashDataSource")
public void setDataSource(final DataSource dataSource) {
this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
} ..snip...
更新:我需要进行 simpleJdbcTemplate 插入,因为我有多个数据源,默认情况下,这个测试类无法处理,我无法找到支持 spring 的解决方案,但在 spring 论坛上发布了一个贡献者这种解决方法。在我提取这个超类之前存在回滚问题。我假设问题比这更基本,hibernate 似乎不知道事务管理器,有什么办法可以证明吗?
数据源 Bean:
<bean id="dashDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dashtemplate"/>
<property name="username" .../>
<property name="password" .../>
</bean>
我的 Context-text.xml(简化,省略了一些)
<!-- Hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dashDataSource" />
<property name="annotatedClasses">
<list>
<value>com.dash.Category</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
</bean>
<bean id="dashTemplateRepository" class="com.wdp.DashTemplateRepositoryHibernateTemplateImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
测试运行良好,我的对象被持久化了,但它永远不会回滚,似乎也没有任何错误
【问题讨论】:
-
DashTemplateRepositoryHibernateTemplateImpl长什么样子? -
为什么要回滚?
-
@Bozho:我相信
@TransactionConfiguration的defaultRollback属性应该表明 -
所以即使交易成功也应该发生回滚?听起来很奇怪 :) 此外,
true似乎是默认值。 -
@bozho 这是 Spring 事务测试套件的默认行为。这样你就可以在真实数据库上运行集成测试而不会污染它们
标签: java hibernate spring transactions junit