【问题标题】:Spring Transactional Unit Tests - Hibernate Queries Not Rolling BackSpring 事务性单元测试 - 休眠查询不回滚
【发布时间】: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:我相信@TransactionConfigurationdefaultRollback 属性应该表明
  • 所以即使交易成功也应该发生回滚?听起来很奇怪 :) 此外,true 似乎是默认值。
  • @bozho 这是 Spring 事务测试套件的默认行为。这样你就可以在真实数据库上运行集成测试而不会污染它们

标签: java hibernate spring transactions junit


【解决方案1】:

问题是 MySQL 使用的是 MyISAM 而不是 InnoDB - MyISAM 不支持回滚

【讨论】:

    【解决方案2】:

    这就是我的基础测试类的样子,对我来说效果很好。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath*:/context.xml"})
    @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
    @Transactional
    public class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {
    //....
    }
    

    【讨论】:

    • 这在几个月后的另一个项目中为我工作 - 虽然没有解决最初的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多