2010-07-12 133 views
0

我正在使用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的解决方案,但在春季论坛上,贡献者发布了这个解决方案。在我提取这个超类之前存在回滚问题。我假设问题比这更基本,hibernate似乎并没有意识到事务管理器,有什么方法可以证明这一点?

数据源豆:

<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> 

我的上下文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> 

测试运行正常,我的对象持久化,但是它不可能回滚,似乎没有任何错误

+0

是什么'DashTemplateRepositoryHibernateTemplateImpl'样子支持? – skaffman 2010-07-12 22:01:31

+0

为什么要回滚? – Bozho 2010-07-13 00:07:24

+0

@Bozho:我相信'@ TransactionConfiguration'的'defaultRollback'属性应该表示 – skaffman 2010-07-13 08:37:02

回答

6

的问题是,MySQL的使用的MyISAM而不是InnoDB的 - 回滚不被MyISAM的

2

这是我的基础测试类看起来像,并为我工作得很好。

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

这个工作很多个月后,我在一个不同的项目 - 尽管没有解决原来的问题 – walnutmon 2011-02-21 21:15:46