Pregunta

I'm trying to write simple junit test which will test my jpa2 entities. At this point I don't have a spring data jpa repository yet, I just want to use EntityManager to load/save data. When I annotate the test method with @Transactional I get the following error. How to solve this?

    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

Here is the test class:

@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());
}

}

Here is the root-context.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>

Nothign fancy in entity class ...

¿Fue útil?

Solución

Spring Framework 3.1.4.RELEASE (i.e., spring-orm) is not compatible with Hibernate 4.2.6.

For details, see: https://jira.springsource.org/browse/SPR-10395

If you need to continue using Spring Framework 3.1.4.RELEASE (e.g., if you cannot upgrade to a more recent version like 3.2.4), you'll have to downgrade to Hibernate 4.1.

Regards,

Sam

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top