2010-07-12 156 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