2015-09-24 32 views
16

最近我升級我的所有jar文件的最新版本(春季4.2.x版,JPA和Hibernate)無法回滾,連不上

現在我面臨的測試用例的一些問題。這裏是stackTrace的測試...

org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking 
    at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:548) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:853) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830) 
    at org.springframework.test.context.transaction.TransactionContext.endTransaction(TransactionContext.java:125) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:218) 
    at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:313) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:93) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:86) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:241) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: javax.persistence.PersistenceException: unexpected error when rollbacking 
    at org.hibernate.jpa.internal.TransactionImpl.rollback(TransactionImpl.java:111) 
    at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:544) 
    ... 25 more 
Caused by: org.hibernate.TransactionException: rollback failed 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:217) 
    at org.hibernate.jpa.internal.TransactionImpl.rollback(TransactionImpl.java:108) 
    ... 26 more 
Caused by: org.hibernate.TransactionException: unable to rollback against JDBC connection 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:167) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:211) 
    ... 27 more 
Caused by: java.sql.SQLRecoverableException: Closed Connection 
    at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:3948) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:163) 
    ... 28 more 

它說連接關閉....並且不能回滾。休眠池的連接是否自動關閉連接?有沒有人有什麼想法是什麼造成的?

編輯: 測試代碼添加

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "testConfig.xml" }) 
@Transactional 
@TransactionConfiguration(transactionManager = "test.txManager", defaultRollback = true) 
public class ControllerTest { 
... logs ... 

    @Autowired 
    private Controller controller; 
    static final String testIdValue = "114294"; 
    ... other decorations... 

    private Request createRequest() throws Exception { 
     Request r = new Request(); 
     r.setTask(true); 
     other set for test values... 
     r.assignTaskList(...); 
     ... 
     return r; 
    } 

    @Test 
    public void assignEndpointsForsSynchTest() throws Exception { 

     Request req = createRequest(); 

     try { 
      Response resp = Controller 
        .assignTask(req); 
      assertTrue(req.SUCCESSFUL); 
     } catch (Exception e) { 
      log.info(e.getMessage()); 
      fail("Unexpected Exception"); 
     } 
    } 

} 

XML文件(如果需要,我會重新編輯的詳細信息,測試大)

<?xml version="1.0" encoding="utf-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
        "> 

    <bean id="log4jInitialization" 
     class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> 
     <property name="targetMethod" value="initLogging" /> 
     <property name="arguments"> 
      <list> 
       <value>classpath:log4j.properties</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="test.dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     lazy-init="false"> 
     <property name="driverClassName" value="org.h2.Driver" /> 
     <property name="url" 
      value="jdbc:h2:mem:test_mem;DB_CLOSE_DELAY=-1;MODE=ORACLE" /> 
    </bean> 

    <jdbc:initialize-database data-source="test.dataSource"> 
     <jdbc:script location="com/sky/ac/core/engine/comp/schema.sql" /> 
     <jdbc:script location="com/sky/ac/core/engine/comp/test_data.sql" /> 
    </jdbc:initialize-database> 


    <bean id="test.txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="test.entityMgrFactory" /> 
     <property name="jpaDialect"> <!-- to support mixed jpaDAO and jdbcTemplateDAO access --> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
     </property> 
    </bean> 

    <bean id="test.entityMgrFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="paPersistence" /> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.sky.ac.core.lock.data</value> 
       <value>com.sky.ac.core.vs.dao.jpa</value> 
       <value>com.sky.ac.core.sr.data</value> 
       <value>com.sky.ac.core.rule.data</value> 
       <value>com.sky.ac.core.util.data</value> 
       <value>com.sky.ac.core.trace.data</value> 
      </list> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="database" value="ORACLE" /> 
      </bean> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.format_sql">false</prop> 
       <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop> 
       <prop key="hibernate.id.new_generator_mappings">true</prop> 
       <prop key="hibernate.connection.release_mode">after_statement</prop> 
      </props> 
     </property> 
     <property name="dataSource" ref="test.dataSource" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="test.txManager"/> 

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

....bean class defs.... 
+0

你可以發佈測試嗎? –

+0

讓我知道是否需要提供更多信息。我的意思是我使用與以前版本相同的代碼運行,但不知何故,新版本有錯誤 – logger

+0

您的'test.entityMgrFactory' bean使用'jpaVendorAdapter'將數據庫屬性設置爲'ORACLE',並且'dataSource'屬性指向H2具有'ORACLE'模式的數據源。您是否嘗試禁用'ORACLE'模式並將'jpaVendorAdapter'更改爲H2?只是測試會發生什麼。 – malaguna

回答

0

有一個非常類似的bug Spring 3.2.2發佈(Jira SPR-10395)與Hibernate 4.2。

但是,您使用另一個春天的版本。這個問題似乎在Hibernate Entity Manager中。(至少在4.2.5最終版本中)。

試圖改變這種休眠的Dependance(升級或drowngrade):

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.x.x</version> 
</dependency> 
+0

感謝您的迴應,但我們不在我們的遺留代碼中使用maven。它不適用於此。 – logger

+0

即使你不使用Maven作爲軟件項目管理(我通常使用它),也許你可以手動測試它。其實我對根本原因感興趣(由於Hibernate或其他)。謝謝你讓我張貼:) –

0

無法回滾JPA交易;嵌套異常是javax.persistence.PersistenceException:回滾時出現意外錯誤。

這意味着有一些斷開。

要修復斷開連接的問題並使jpa能夠重新連接到數據庫服務器,application.properties文件應包含以下屬性。

spring.datasource.connection-test-query=SELECT 1 
spring.datasource.test-while-idle=true 
spring.datasource.test-on-borrow=true 
spring.datasource.validation-interval=10000 
spring.datasource.log-validation-errors=true 
spring.datasource.validation-query=SELECT 1 
+0

已經嘗試過這個,但它沒有JPA /應用程序屬性,因爲與此相關的其他代碼也使用hibernate作爲dao並且未檢測到任何問題 – logger

1

請不要在服務器模式下使用H2,用它在嵌入式模式 支持@Transactional回滾。

由於服務器模式下H2不支持事務回滾,因此會引發上述異常,默認情況下爲自動提交。一旦你的查詢被執行,它就會自動提交併關閉會話。因此,回滾會導致引發的異常。

要在嵌入模式下使用H2,請將jar添加到classpath中,並將數據源bean替換爲<jdbc:embedded-database id="dataSource" type="H2" />。在你的情況下,價值將是id="test.dataSource"

下面是H2一些已知問題在服務器模式下使用時:

我的建議是使用提供良好的支持與提交事務數據庫並回滾測試,例如MySQL InnoDB

請讓我知道你是否繼續有異常,即使嘗試了這一點。