SpringPersistenceUnitInfo :: Ошибка абстрактного метода

#spring #jpa-2.0

#весна #jpa-2.0

Вопрос:

У меня есть приложение, использующее Spring 3.0.5, JPA2 и Hibernate 3.6.7. Maven обрабатывает мое управление зависимостями. Вот выдержка из pom:

 <properties>
  <spring.version>3.0.5.RELEASE</spring.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>
...
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-hibernate3</artifactId>
    <version>2.0.8</version>
    <scope>compile</scope>
      <exclusions>
         <exclusion>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate</artifactId>
     </exclusion>
      </exclusions>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.6.7.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.6.7.Final</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jpa</artifactId>
    <version>2.0.8</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.hibernate.java-persistence</groupId>
    <artifactId>jpa-api</artifactId>
    <version>2.0-cr-1</version>
    <scope>compile</scope>
  </dependency>
...
  

Приложение отлично собирается, однако при попытке загрузить его контейнер Tomcat жалуется на следующее:

Вызвано: org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем 'EntityManagerFactory', определенным в ресурсе ServletContext [/WEB-INF/applicationContext.xml ]: Не удалось вызвать метод инициализации; вложенным исключением является java.lang.Ошибка абстрактного метода: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode; 
 в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) 
 в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
 в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)

Есть мысли о том, что может быть причиной этого? Все зависимости кажутся неповрежденными.

Спасибо.

Ответ №1:

Вы смешиваете артефакты из Spring 2.x и 3.x .

Замените старые версии spring-hibernate3 и spring-jpa на

 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-orm</artifactId>
     <version>${spring.version}</version>
     <scope>compile</scope>
</dependency> 
  

Комментарии:

1. спасибо, что указали на это — удаление ссылки на spring-hibernate3, похоже, проясняет ситуацию

Ответ №2:

У меня была точно такая же проблема. Я был валидатором гибернации (4.2), tomcat 6 и spring 3.0.6. Но я также обновил hibernate с 3.2 до 3.6, но я забыл удалить hibernate-entitymanager.jar (который является старым jar-файлом hibernate) из classpath.

Ответ №3:

У меня была очень похожая проблема с Hibernate 4.x, Spring 3.x, JPA 2.x и CXF 2.7.5. Я удалил ссылку на артефакт spring-jpa в моем файле maven POM и вставил ваш рекомендуемый фрагмент. Сработало волшебство! Я больше не вижу исключения. Спасибо!