4

我们正在尝试使用 Hibernate 作为 WebSphere Application Server 7.0 上的 JPA 提供程序。但是我们遇到了以下异常。

javax.ejb.EJBException:注入失败;嵌套异常是:

java.lang.IllegalStateException:尚未为 PU 创建 EntityManagerFactory:PuId=data_commonweb#data_ejb_common.jar#data_common

原因:java.lang.IllegalStateException:EntityManagerFactory 尚未为 PU 创建:PuId=data_commonweb#data_ejb_common.jar#data_common

Persistense.xml如下:

    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/db_ds</jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialet"/>
        <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>
        <property name="openjpa.TransactionMode" value="managed"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
    </properties>
</persistence-unit>

4

2 回答 2

1

经过认真研究,我在这里发现了一个变化:

http://forum.spring.io/forum/spring-projects/data/115284-jpa2-with-spring-data-deployed-on-websphere-7-without-websphere-jpa2-feature-pack

JPA2 with spring-data deploying on Websphere 7 WITHOUT Websphere JPA2 feature pack Mar 22nd, 2012, 08:52 PM 经过一天的研究,终于找到了无需安装Websphere JPA2功能即可在Websphere 7或更低版​​本上运行JPA 2的方法盒。

Websphere 7 默认支持 JPA1,但在尝试运行 JPA2 时会产生类加载器问题,并且一如既往,Websphere 没有任何明确的文档来解决此限制。这是一个非常简单的解决方案来解决这个问题:

  1. Persistence.xml 文件修复

解决此问题的两种方法:

  • 摆脱 persistence.xml 文件。或者
  • 将 persistence.xml 重命名为 persistence_WAS.xml

示例代码代码:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence_WAS.xml"/>
</bean>

这是因为默认情况下,J2EE 容器在 web 应用程序的 META-INF/ 下查找 persistence.xml 并保留此文件将导致 websphere7 初始化 JPA1 忽略使用 JPA2 的请求。通过使用 Spring Data 配置,摆脱 persistence.xml 是我的选择。(抛出 XML 版本属性的验证异常无效)

  1. 手动初始化您的持久性管理器(删除对 Websphere 的依赖) LocalContainerEntityManagerFactoryBean 由 Spring 提供以创建持久性管理器。

(或使用 JPA API 初始化您自己的 Persistence Manager)

在 PersistentUnitInfo 中传递您所需的值。

  1. 将 XML Parsing Jars 添加到您的应用程序库中

这是因为一旦我们将 Websphere 的类加载器策略更改为最后一个父级,它就无法初始化 XML 解析库

以下是完整列表:

  • xalan-2.7.jar
  • xbean-2.2.0.jar
  • xbean_xpath-2.2.0.jar
  • xercesImpl-2.6.2.jar
  • xml-apis-2.8.jar
  • xmlpublic-2.2.0.jar
  • XmlSchema-1.4.7.jar
  • xpp3-1.1.3.4.O.jar
  • xstream-1.2.1.jar

    1. 更改 Websphere 应用程序服务器上的类加载器策略

在从您的 WAR 或 EAR 文件加载所有 JAR 之后,让 Websphere 最终加载其内部和扩展 JAR - PARENT_LAST 在这里起到了作用。

这是更新路径 � 步骤

在下面Applications > Application Types > WebSphere enterprise applications

选择部署的应用程序:

Enterprise Applications > JPA2-Application > Manage Modules

选择 WAR 文件,例如。JPA2-Application.war

将 Class loader order 设置更改为 Classes loaded with local class loader first(parent last) 在 Class loader viewer 下,您可以看到 ClassLoader - Search Order - 您可以看到 EAR 中的 Jars 和类首先加载。

在我的情况下不需要额外的库(步骤 3)

于 2014-08-26T18:37:13.183 回答