1

最初在我们的项目中,我们使用的是 spring 3 + hibernate 3 最近已决定升级 3rd 方 jar,作为 spring 升级到 4 但不是 hibernate 的一部分(仍然保持 hibernate 3)。现在我们没有为 spring 4 升级更改任何代码,当我们执行项目时 LocalContainerEntityManagerFactoryBean 注入失败。我在下面给出了上下文文件声明和错误堆栈跟踪。现在的问题是如何在不升级hibernate的情况下让现有项目在spring 4上运行。

使用 Spring ORM 4.1.6 LocalContainerEntityManagerFactoryBean 正在尝试加载 JPA 2.0 特定的休眠导入(即休眠 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" />

错误堆栈跟踪

原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [applicationContext-securityEJB-DBtest.xml] 中定义名称为“entityManagerFactory”的 bean 创建错误:bean 类型 [class org.springframework.orm] 的后处理失败.jpa.LocalContainerEntityManagerFactoryBean] 失败;嵌套异常是 java.lang.IllegalStateException:无法自省 bean 类 [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] 的持久性元数据:在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory 找不到它依赖的类。 applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:936) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。

4

1 回答 1

0

当前在项目中使用的技术:Hibernate 3 + 以及最近的技术堆栈升级 Spring 已更改为 4.1 版本。Spring 4.1 强制使用 JPA 2.0,同时它提供向后支持,这意味着它提供了 JPA 1.0 支持,请参阅以下来自 Spring 站点的描述。

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 注入时间内失败。扩展 Spring-ORM 类的 LocalContainerEntityManagerFactoryBean 试图加载 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" />

解决方案

  1. 选项 I:保留旧版本的 Spring-ORM 以使其按原样工作 [这是我们目前正在做的工作]。

  2. 选项二:将 3,4 个 spring-orm java 类复制到我们的项目中,并根据我们的需要调整 spring 类代码[我打算以这种方式实现]。

  3. 方案三:这是在研究中,试图找到另一种注入 entityManager 的替代方法。
于 2016-08-21T06:50:06.893 回答