2013-05-14 165 views
4

我想測試我的DAO,它使用JPA EntityManager來獲取和更新實體。我已將單元測試標記爲Transactional,並將defaultRollback屬性設置爲false。但是,在投擲符文時間異常時,我沒有看到我的交易在測試結束時回滾。數據持續存在於數據庫中。這是我的單元測試代碼以及​​彈簧配置。我明顯錯過了一些東西,但沒有能夠確定什麼。 順便說一句,該交易是在persistence.xml春季JUnit JPA交易不回滾

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:spring/test-jpa.xml"}) 
@TestExecutionListeners(
{ DependencyInjectionTestExecutionListener.class, 
TransactionalTestExecutionListener.class, 
DbUnitTestExecutionListener.class 
}) 
@TransactionConfiguration(defaultRollback=false) 
@Transactional 
public class JpaTests { 
    @PersistenceContext 
    EntityManage em; 

    @Test 
    public void testTransactionQueueManager() { 
     Object entity = em.find(1); 
     //code to update entity omitted. 
    entity = em.merge(entity); 
    em.flush(); 
     throw new RuntimeException 
    } 
} 

Spring配置文件RESOURCE_LOCAL

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="${jpa.driverclassname}" /> 
    <property name="url" value="${jpa.url}" /> 
    <property name="username" value="${jpa.username}" /> 
    <property name="password" value="${jpa.password}" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="${jpa.persistenceunitname}"/> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> 
      <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DBDictionary"/> 
     </bean> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 
+0

您是如何驗證事務沒有回滾的?數據庫有更新值嗎?你使用的是哪個數據庫,如果它使用什麼存儲引擎? – gkamal 2013-05-14 07:33:20

+0

是的,我使用SQL Server 2008和數據庫已更新的值。順便說一句,我的JPA提供商的IBM WebSphere瘦客戶機 – user320587 2013-05-14 13:41:58

+0

我曾與交易問題不回滾,固定它通過TransactionalTestExecutionListener.class謝謝!!!! – avalon 2017-03-31 11:50:10

回答

0

@TransactionConfiguration(defaultRollback = FALSE)

可能是罪魁禍首。試試defaultRollback = true,它應該回滾事務。

+0

默認情況下已啓用。 – kboom 2014-11-08 17:17:37

0

添加rollbackFor可能會有幫助,這是一個常見的問題。

@Transactional(rollbackFor=Exception.class)