在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>
答案 0 :(得分:1)
将新的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复制到您的类路径中。
为应用程序配置app server类加载器顺序 - 首先加载新的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
答案 1 :(得分:1)
您可以通过ServletContextListener覆盖持久性提供程序。
首先实现PersistenceProviderResolver
:
public class HibernatePersistenceProviderResolver implements PersistenceProviderResolver {
private static final Logger LOGGER = LoggerFactory.getLogger(HibernatePersistenceProviderResolver.class);
private volatile PersistenceProvider persistenceProvider = new HibernatePersistence();
public List<PersistenceProvider> getPersistenceProviders() {
return Collections.singletonList(persistenceProvider);
}
public void clearCachedProviders() {
persistenceProvider = new HibernatePersistence();
}
public static void register() {
LOGGER.info("Registering HibernatePersistenceProviderResolver");
PersistenceProviderResolverHolder.setPersistenceProviderResolver(new HibernatePersistenceProviderResolver());
}
}
然后创建ServletContextListener
的实现并'注册'ProviderResolver:
public class HibernateContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce) {
HibernatePersistenceProviderResolver.register();
}
public void contextDestroyed(ServletContextEvent sce) {
// nothing to do here
}
}
并在web.xml中将其添加为侦听器:
<listener>
<listener-class>my.context.listener.HibernateContextListener</listener-class>
</listener>
答案 2 :(得分:0)
您必须将以下属性添加到persistence.xml文件中:
<property
name="hibernate.transaction.factory_class"
value="org.hibernate.transaction.CMTTransactionFactory"
/>
<property
name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"
/>
还要将所有hibernate .jar库添加到您的包lib文件夹(.war或.ear)中,然后将服务器的类加载策略更改为Parent Last而不是默认的Parent First,您可以使用域管理器控制台(Dmgr)位于:
服务器&gt; $ SERVER_NAME&gt;服务器特定的应用程序设置
重新启动服务器,这应该可以解决问题。
问候。