在WebSphere Community Edition 2.1上运行的Spring 3 MVC项目中,我试图配置我的entityManagerFactory。但是,似乎无法覆盖PersistanceProvider。它默认为OpenJPA,甚至将其作为隐藏类排除在外:

<sys:hidden-classes>
  <sys:filter>org.apache.openjpa</sys:filter>
</sys:hidden-classes>


但是,在尝试部署应用程序时,在WebSphere中出现以下错误:

javax.persistence.PersistenceException: Invalid or inaccessible provider class: org.apache.openjpa.persistence.PersistenceProviderImpl


即使我在persistance.xml中提供了另一个提供程序(HibernatePersistence):

<persistence-unit name="com.intl.cigna">
  <description>
    Persistence unit for the JPA implementation
  </description>
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <non-jta-data-source>java:comp/env/jdbc/myJndiDS</non-jta-data-source>
  <properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect"/>
    <property name="hibernate.show_sql" value="true" />
  </properties>
</persistence-unit>

最佳答案

要将新的JPA提供程序部署为应用程序的一部分,请执行以下操作:


确保persistence.xml <provider>元素指向新的JPA提供程序的javax.persistence.spi.PersistenceProvider实现。
在应用程序中构建新的JPA持久性代码-将所有必需的jar部署到应用程序EAR / WAR / CLASSPATH中。

复制hibernate3.jar和lib / required中可用的所需第三方库
同样将lib / jpa / hibernate-jpa-2.0-api-1.0.0.Final.jar复制到您的类路径中。
为您的应用程序配置应用程序服务器类加载器顺序-首先加载新的JPA类。如果没有正确配置类加载器,则应用程序将使用应用程序服务器随附的JPA提供程序,而不是第三方JPA提供程序。
如果将提供程序捆绑在EAR文件中,则需要JPA的应用程序模块中
访问,在中指定第三方持久性提供程序二进制文件
Manifest.mf类路径。

如果将提供程序捆绑在WAR文件中,请在Web应用程序的WEB-INF / lib目录中包括必要的提供程序二进制文件。


要在共享库中部署新的JPA提供程序:


确保persistence.xml <provider>元素指向新的JPA提供程序的javax.persistence.spi.PersistenceProvider实现。
在共享库中定义持久性提供程序
如果许多应用程序都访问该库,请将共享库与服务器类加载器关联。否则,请将共享库与应用程序类加载器关联。
为您的应用程序配置类加载器顺序-首先加载新的JPA类。如果没有正确配置类加载器,则应用程序将使用应用程序服务器随附的JPA提供程序,而不是第三方JPA提供程序。


Websphere 8 JPA provider configuration
Hibernate 3.5 configuration
WAS CE - overriding class load order
WAS CE 2.0 - using frameworks, including Hibernate

09-04 05:41
查看更多