Ошибка org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean после обновления jar-файла spring-orm до версии 4.1.6

Первоначально в нашем проекте мы использовали spring 3 + hibernate 3. Недавно было решено обновить сторонние jar-файлы, поскольку часть этого spring обновлена ​​​​до 4, но не в спящем режиме (по-прежнему поддерживается спящий режим 3). Теперь мы не изменили код для весеннего обновления 4, и когда мы выполняем проект LocalContainerEntityManagerFactoryBean, происходит сбой. Я дал объявление файла контекста и трассировку стека ошибок ниже. Теперь вопрос в том, как я могу заставить существующий проект работать на весне 4 без обновления спящего режима.

С Spring ORM 4.1.6 LocalContainerEntityManagerFactoryBean пытается загрузить специфичный для JPA 2.0 импорт спящего режима (то есть классы hibernate 4 jar) и терпит неудачу.

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
    <property name="persistenceUnitName" value="casp-portal"/>
</bean>
<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
    <!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

Технологии, используемые в настоящее время в проекте: Hibernate 3+ с недавним обновлением стека технологий Spring заменен на версию 4.1. Spring 4.1 заставляет использовать JPA 2.0, в то же время он обеспечивает обратную поддержку, то есть поддерживает JPA 1.0, см. ниже описание, взятое с сайта Spring.

Трассировка стека ошибок


person JB.    schedule 05.04.2016    source источник


Ответы (1)


Java EE версии 6 или выше теперь считается базовой версией для Spring Framework 4, при этом особое значение имеют спецификации JPA 2.0 и Servlet 3.0. Чтобы сохранить совместимость с Google App Engine и старыми серверами приложений, можно развернуть приложение Spring 4 в среде Servlet 2.5. Тем не менее, Servlet 3.0+ настоятельно рекомендуется и является обязательным условием в тестовых и фиктивных пакетах Spring для тестовых настроек в средах разработки.

Актуальная проблема: тестовые примеры jUnit дают сбой во время выделенного ниже времени внедрения bean-компонента. LocalContainerEntityManagerFactoryBean, который расширяет классы Spring-ORM, пытается загрузить специфичный для JPA 2.0 импорт спящего режима и терпит неудачу.

Решения:

<bean id="entityManagerFactory"
    class="com.abc.persist.LocalContainerEntityManagerFactoryBean">

    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-security.xml"/>
    <property name="persistenceUnitName" value="casp-portal"/>
    <property name="jpaPropertyMap">
        <map>
          <entry key="javax.persistence.sharedCache.mode" value="none" />
        </map>
      </property>
</bean>
<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
    <!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

Вариант I: оставьте старую версию Spring-ORM, чтобы она работала как есть [это то, что мы сейчас делаем в качестве обходного пути].

  1. Вариант II: Скопируйте классы Java 3,4 spring-orm в наш проект и настройте код классов Spring в соответствии с нашими потребностями [я планирую реализовать этот способ].

  2. Вариант III. Это находится в стадии исследования, пытаясь найти другой альтернативный способ внедрить entityManager.

  3. Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем «entityManagerFactory», определенным в ресурсе пути к классу [applicationContext-securityEJB-DBtest.xml]: сбой постобработки типа компонента [класс org.springframework.orm .jpa.LocalContainerEntityManagerFactoryBean] не удалось; вложенным исключением является java.lang.IllegalStateException: не удалось проанализировать класс компонента [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] для метаданных сохранения: не удалось найти класс, от которого он зависит, в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory. applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:936) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) в org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) в org.springframework.beans. factory.support.AbstractBeanFactory.d oGetBean(AbstractBeanFactory.java:299) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) в org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) в org .springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) в org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) в org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext. java:139) в org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:93) в sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43) в java.lang.reflect.Method.invoke(Method.java:606) в org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) в org.junit.internal.runners.model. ReflectiveCallable.run(ReflectiveCallable.java:15) в org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) в org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) в org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) в org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) в org.junit.runners.ParentRunner$3.run(ParentRunner.java: 193) в org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) в org.junit.runners.ParentRunner.access$000(ParentRunner .java:42) в org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) ... еще 11 Причина: java.lang.IllegalStateException: Не удалось выполнить самоанализ класса компонента [org.springframework.orm.jpa .LocalContainerEntityManagerFactoryBean] для метаданных сохраняемости: не удалось найти класс, от которого он зависит на org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:396) на org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostwork.springPost3frame) на java:396 factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:931) ... еще 44 Class.privateGetDeclaredMethods(Class.java:2615) на java.lang.Class.getDeclaredMethods(Class.java:1860) на org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:420) на org.springframework .orm.jpa.support.PersistenceAnnotationBean PostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:392) ... еще 46 Вызвано: java.lang.ClassNotFoundException: javax.persistence.ValidationMode в java.net.URLClassLoader$1.run(URLClassLoader.java:366) в java.net. URLClassLoader$1.run(URLClassLoader.java:355) в java.security.AccessController.doPrivileged(собственный метод) в java.net.URLClassLoader.findClass(URLClassLoader.java:354) в java.lang.ClassLoader.loadClass(ClassLoader.java :425) на вс.разное. Launcher$AppClassLoader.loadClass(Launcher.java:308) на java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... еще 51
person JB.    schedule 21.08.2016