2010-06-27 58 views
4

我的DAO集成測試失敗,因爲在測試期間創建的實體在下一次測試開始時仍在數據庫中。從MySQL 5和H2中都可以看到完全相同的行爲。Spring/JTA/JPA DAO集成測試不會回滾?

測試類註釋有:

@Transactional 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ "/testPersist-applicationContext.xml" }) 

在測試應用上下文中的事務bean配置如下:

<tx:annotation-driven /> 

<bean id="transactionManager" 
class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="userTransaction" ref="atomikosUserTransaction" /> 
</bean> 

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
init-method="init" destroy-method="close"> 
    <property name="forceShutdown" value="false" /> 
</bean> 

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
    <property name="transactionTimeout" value="300" /> 
</bean> 

實體管理器被配置如下:

<bean id="myappTestLocalEmf" 
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="myapp" /> 
    <property name="persistenceUnitPostProcessors"> 
     <bean    class="com.myapp.core.persist.util.JtaPersistenceUnitPostProcessor"> 
     <property name="jtaDataSource" ref="myappPersistTestJdbcDataSource" /> 
     </bean> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
      <property name="database" value="$DS{hibernate.database}" /> 
      <property name="databasePlatform" value="$DS{hibernate.dialect}" /> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup 
      </prop> 
      <prop key="hibernate.format_sql">true"</prop> 
      <prop key="hibernate.use_sql_comments">true</prop> 
      </props> 
    </property> 
</bean> 

<context:annotation-config /> 

日誌文件中的一切似乎都很好......我可以看到消息從Spring回滾以及從Atomikos回滾。但坦白地說,日誌非常龐大而且非常複雜,我可能很容易丟失一些東西......

然而插入的測試數據仍然存在!任何線索?

回答

6

原來我C3P0 JDBC數據源不知道XA,並因此不參與交易。爲什麼我沒有收到錯誤,也沒有在日誌文件中發出警告,我不知道。儘管如此,您無法使用XA感知數據源的原因很好地解釋爲here。請注意,數據源不需要具有XA功能...只需XA知道。

用下面的數據替換C3P0數據源解決了這個問題。

<bean id="myappJTANonXADataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"> 
     <property name="uniqueResourceName" value="myappDatabase" /> 
     <property name="driverClassName" value="$DS{hibernate.connection.driver_class}" /> 
     <property name="url" value="$DS{hibernate.connection.url}" /> 
     <property name="user" value="$DS{hibernate.connection.username}" /> 
     <property name="password" value="$DS{hibernate.connection.password}" /> 
     <property name="maxPoolSize" value="20" /> 
     <property name="reapTimeout" value="300" /> 
</bean> 
+1

非常感謝,有一個類似的問題(沒有春天),它幫助我 – Ittai 2010-11-21 18:40:45

1

我認爲您需要詳細閱讀日誌。這可能是因爲你看到的回滾正在工作,除了其他的東西首先執行了提交。我也無法看到代碼中的任何指示自動回滾的內容。而且它應該在每次測試結束時發生。如果您依賴基於超時的回滾,則可能是第二個測試在超時發生之前運行,因此它會在數據回滾之前看到數據。這裏

許多選項有:-)

+0

Spring Test runner執行回滾。我可以看到Spring Test和Atomikos創建事務並執行回滾。但是,好像Hibernate/JDBC數據連接一定不能正確地同步。爲了確保它不是Spring Test,C3P0,JDBC或Hibernate問題,我將數據源直接注入到實體管理器中,並切換到RESOURCE_LOCAL持久性單元,並且所有事情都按預期工作。所以問題在於Atomikos和/或我的後置處理器在應用服務器之外缺少JNDI。 – HDave 2010-06-29 19:01:29