Hi,
we have a web application that uses Spring 3, Hibernate 3.5 and and JPA2 and is managed using Maven. When running it through Maven (for example mvn jetty:run), it works perfectly. But strangely, when packaged as a WAR it fails to start.
I created a minimal web application to demonstrate the problem. It actually contains no executable code, it just configures a memory database, Hibernate, JPA and Spring's Dispatcher servlet. When started within maven as mvn jetty:run, and also mvn tomcat:run, it starts as expected. However, when packaged as a WAR and deployed, it fails to start with this exception:
The problem can be also demonstrated by running mvn tomcat:run-war.Code:Caused by: java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getSharedCacheMode()Ljavax/persistence/SharedCacheMode; at org.hibernate.ejb.util.LogHelper.logPersistenceUnitInfo(LogHelper.java:39) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:509) at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:72) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:218) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:251) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) ... 42 more
I'm attaching the demonstration application.
Any idea what is causing the problem and how to solve it? I've been looking for a solution for several hours already, but without success. Presumably it is somehow related to SPR-6408 Add full support for JPA 2.0 PersistenceUnitInfo and SPR-6705 Spring 3.0 not compatible with Hibernate 3.5 beta3. In class org.springframework.orm.jpa.persistenceunit.Defaul tPersistenceUnitManager a presence of JPA2 is checked and if present, the instance of PersistenceUnitInfo is wrapped into a proxy that adds JPA2 specific method. But it looks like the solution is not perfect and in my case it fails.
Thanks for help,
Petr
------------------------------------------------------------------
PS: I'm attaching the important sources for convenience:
pom.xml:
Spring configuration (context-main.xml):Code:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>jpa2</artifactId> <packaging>war</packaging> <name>JPA2 + Spring problem example</name> <version>1.0-SNAPSHOT</version> <properties> <hibernate.version>3.5.1-Final</hibernate.version> <spring.version>3.0.5.RELEASE</spring.version> <logback.version>0.9.27</logback.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- ================================================ --> <!-- DEPENDENCIES --> <!-- ================================================ --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jpa</artifactId> <version>2.0.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <!-- Logging --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> <!-- Embedded database --> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.0.0</version> </dependency> </dependencies> <!-- ================================================ --> <!-- BUILD --> <!-- ================================================ --> <build> <plugins> <!-- JETTY --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.26</version> <dependencies> <dependency> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-plus</artifactId> <version>6.1.16</version> </dependency> </dependencies> <configuration> <contextPath>/</contextPath> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> <dependencies> </dependencies> </plugin> </plugins> </build> <!-- ================================================ --> <!-- Repository Configuration --> <!-- ================================================ --> <repositories> <repository> <id>spring-ext</id> <name>Spring External Dependencies Repository</name> <url> https://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/ </url> </repository> <!-- pro Hibernate: --> <repository> <id>jboss</id> <name>JBoss Maven2 Repository</name> <url>http://repository.jboss.org/maven2/</url> </repository> </repositories> </project>
Code:<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" 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-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <bean id="dataSource" class="org.hsqldb.jdbc.JDBCDataSource"> <property name="database" value="jdbc:hsqldb:mem:playground" /> <property name="user" value="sa" /> <property name="password" value="" /> </bean> <bean name="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> <property name="defaultDataSource" ref="dataSource" /> </bean> <bean name="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="generateDdl" value="true" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="default" /> <property name="persistenceUnitManager" ref="persistenceUnitManager"/> <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/> </bean> </beans>


Reply With Quote
