views:

124

answers:

1

Using Hibernate EntityManager 3.5.3-Final together with Unitils 3.1 results in:

unitilsAfterTestTearDown(com.unifiedpost.payments.model.TestAccount)  Time elapsed: 0.02 sec  <<< FAILURE!
java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
        at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:621)
        at org.unitils.orm.jpa.util.provider.hibernate.UnitilsHibernatePersistenceProvider.createContainerEntityManagerFactory(UnitilsHibernatePersistenceProvider.java:47)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:227)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:281)
        at org.unitils.orm.jpa.util.JpaEntityManagerFactoryLoader.createEntityManagerFactoryBean(JpaEntityManagerFactoryLoader.java:77)

This is also reported in: http://jira.unitils.org/browse/UNI-201

+1  A: 

The reason is that unitils-orm depends on a 2.5.x release of Spring, which is not JPA2 ready yet.

[INFO] +- org.unitils:unitils-testng:jar:3.1:test
[INFO] +- org.unitils:unitils-orm:jar:3.1:test
[INFO] |  +- org.unitils:unitils-spring:jar:3.1:test
[INFO] |  |  +- org.springframework:spring-core:jar:2.5.2:test
[INFO] |  |  +- org.springframework:spring-beans:jar:2.5.2:test
[INFO] |  |  +- org.springframework:spring-test:jar:2.5.2:test
[INFO] |  |  \- org.springframework:spring-tx:jar:2.5.2:test

See also:

You have 2 workaround options:

(1) Patch Unitils:

  • Checkout Unitils (http://www.unitils.org/source-repository.html)
  • Fix the root pom: Make it depend on a 3.0.1.RELEASE (or higher)
  • Build a release locally
  • Use this as your new Unitils package
<properties>
    <spring.version>3.0.3.RELEASE</spring.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

(2) Include a patched MutablePersistenceUnitInfo

  • Duplicate Spring MutablePersistenceUnitInfo in your project (and make sure it preceeds the legacy Spring version in the classpath)
  • Add the missing methods to it.
@Override
public String getPersistenceXMLSchemaVersion() {
    return "1.0";
}

@Override
public SharedCacheMode getSharedCacheMode() {
    return SharedCacheMode.NONE;
}

@Override
public ValidationMode getValidationMode() {
    return ValidationMode.NONE;
}

[Answered myself for later reference]

Jan
+1 for both question and answer
Pascal Thivent