【问题标题】:Getting 'connection doesn't exist ' in junit test with spring, jpa em and dbunit在使用 spring、jpa em 和 dbunit 的 junit 测试中获取“连接不存在”
【发布时间】:2013-10-19 08:09:14
【问题描述】:

我正在尝试编写简单的 junit 测试来测试我的 jpa2 实体。此时我还没有 spring data jpa 存储库,我只想使用 EntityManager 来加载/保存数据。当我用 @Transactional 注释测试方法时,出现以下错误。如何解决?

    2013-10-19 09:43:26,158 WARN [org.springframework.test.context.TestContextManager] - <Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@31ffa3a1] to process 'after' execution for test: method [public void org.ndsys.dentalrec.domain.PersonTest.testLoadPersonWithRecordsEM()], instance [org.ndsys.dentalrec.domain.PersonTest@64fb8ac], exception [null]>
org.springframework.orm.hibernate3.HibernateSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:690) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:516) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755) ~[spring-tx-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) ~[spring-tx-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:591) ~[spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:297) ~[spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:192) ~[spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:395) ~[spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:91) [spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) [spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) [spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) [spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) [junit-4.11.jar:na]
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) [junit-4.11.jar:na]
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) [junit-4.11.jar:na]
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) [junit-4.11.jar:na]
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) [junit-4.11.jar:na]
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) [spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) [junit-4.11.jar:na]
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) [spring-test-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) [.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) [.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) [.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) [.cp/:na]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) [.cp/:na]
Caused by: org.hibernate.TransactionException: commit failed
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:185) ~[hibernate-core-4.2.6.Final.jar:4.2.6.Final]
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75) ~[hibernate-entitymanager-4.2.6.Final.jar:4.2.6.Final]
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512) ~[spring-orm-3.1.4.RELEASE.jar:3.1.4.RELEASE]
    ... 25 common frames omitted
Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:116) ~[hibernate-core-4.2.6.Final.jar:4.2.6.Final]
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:178) ~[hibernate-core-4.2.6.Final.jar:4.2.6.Final]
    ... 27 common frames omitted
Caused by: java.sql.SQLNonTransientConnectionException: connection exception: connection does not exist
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    at org.hsqldb.jdbc.JDBCUtil.connectionClosedException(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    at org.hsqldb.jdbc.JDBCConnection.checkClosed(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    at org.hsqldb.jdbc.JDBCConnection.commit(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:112) ~[hibernate-core-4.2.6.Final.jar:4.2.6.Final]
    ... 28 common frames omitted
Caused by: org.hsqldb.HsqlException: connection exception: connection does not exist
    at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.3.0.jar:2.3.0]
    ... 33 common frames omitted

这里是测试类:

@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        DbUnitTestExecutionListener.class })
@DatabaseSetup(value = "classpath:person-sample-data.xml", type = DatabaseOperation.CLEAN_INSERT)
@TransactionConfiguration(defaultRollback = false)
public class PersonTest {

Logger logger = LoggerFactory.getLogger(PersonTest.class);

@PersistenceContext
EntityManager em;

@Transactional (readOnly=true)
@Test
public void testLoadPersonWithRecordsEM() {
    logger.info("--- testLoadPersonWithRecordsEM ---");
    Person person = em.find(Person.class, 0L);
    assertNotNull(person);
    assertEquals(person.getFirstName(), "Dragica");

    List<DentalRecord> records = person.getRecords();
    assertEquals(2, records.size());
}

}

这里是根上下文.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:tx="http://www.springframework.org/schema/tx"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->

    <context:component-scan base-package="org.ndsys.dentalrec" />

    <!-- enables scanning for @Transactional annotations -->
    <tx:annotation-driven/>

    <jdbc:embedded-database id="dataSource" type="HSQL" />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="true" />
                <property name="database" value="HSQL" />
            </bean>
        </property>
        <!-- <property name="persistenceUnitName" value="jpa.sample" /> This can 
            be deleted. Nenad -->
        <property name="packagesToScan" value="org.ndsys.dentalrec.domain"></property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.HSQLDialect
                </prop>
                <prop key="hibernate.max_fetch_depth">3</prop>
                <prop key="hibernate.jdbc.fetch_size">50</prop>
                <prop key="hibernate.jdbc.batch_size">10</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

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

</beans>

实体类没有什么花哨的...

【问题讨论】:

    标签: spring jpa junit dbunit spring-test


    【解决方案1】:

    Spring Framework 3.1.4.RELEASE(即spring-orm)与 Hibernate 4.2.6 不兼容。

    详情见:https://jira.springsource.org/browse/SPR-10395

    如果您需要继续使用 Spring Framework 3.1.4.RELEASE(例如,如果您无法升级到更新的版本,例如 3.2.4),则必须降级到 Hibernate 4.1。

    问候,

    山姆

    【讨论】:

    • 谢谢山姆。这解决了问题。我的 spring jar 是 3.2.4,但 spring-data-jpa 模块依赖于 3.1.4。当我明确将其更改为 3.2.4 时,一切都开始起作用了。
    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 2018-05-25
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2017-04-22
    相关资源
    最近更新 更多