Java 如何覆盖WebSphereCommunityEdition(WCE)2.1';s默认持久性提供程序-OpenJPA
在WebSphereCommunityEdition 2.1上运行的Spring3MVC项目中,我试图配置entityManagerFactory。但是,我似乎无法覆盖PersistanceProvider。它默认为OpenJPA,甚至将其作为隐藏类排除:Java 如何覆盖WebSphereCommunityEdition(WCE)2.1';s默认持久性提供程序-OpenJPA,java,spring-mvc,websphere,jpa-2.0,persistence.xml,Java,Spring Mvc,Websphere,Jpa 2.0,Persistence.xml,在WebSphereCommunityEdition 2.1上运行的Spring3MVC项目中,我试图配置entityManagerFactory。但是,我似乎无法覆盖PersistanceProvider。它默认为OpenJPA,甚至将其作为隐藏类排除: <sys:hidden-classes> <sys:filter>org.apache.openjpa</sys:filter> </sys:hidden-classes> 尽管我在pe
<sys:hidden-classes>
<sys:filter>org.apache.openjpa</sys:filter>
</sys:hidden-classes>
尽管我在persistence.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实现的持久化单元
org.hibernate.ejb.HibernatePersistence
java:comp/env/jdbc/myJndiDS
您必须将以下属性添加到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添加到您的包lib文件夹(.war或.ear)中,然后将服务器的类加载策略更改为最后一个父级而不是默认的第一个父级,您可以使用域管理器控制台(Dmgr)在以下位置更改该策略:
服务器>$SERVER\u NAME>特定于服务器的应用程序设置
重新启动您的服务器,这样就可以了
注意。要将新的JPA提供程序部署为应用程序的一部分,请执行以下操作:
persistence.xml
元素指向新JPA提供程序的javax.persistence.spi.PersistenceProvider的实现
要在共享库中部署新的JPA提供程序,请执行以下操作:
persistence.xml
元素指向新JPA提供程序的javax.persistence.spi.PersistenceProvider的实现
您可以通过ServletContextListener覆盖持久性提供程序 首先实现一个
持久化ProviderResolver
:
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());
}
}
并将其添加为web.xml中的侦听器:
<listener>
<listener-class>my.context.listener.HibernateContextListener</listener-class>
</listener>
my.context.listener.HibernateContextListener
错误的堆栈跟踪是什么样子的?谁引发该异常?在尝试部署应用程序时引发该异常。您是否可以粘贴完整的堆栈跟踪,而不仅仅是消息?如果某个异常对您有好处,您是否可以接受它?Q仍然开放。是的,我自己回答了。回答得很好,让我想到这一切是如何联系在一起的。我对JPA进行了装箱,以跟踪使用会话工厂的其他应用程序(对于项目来说是新的,对于团队来说也是新的,所以尝试了JPA)。但是在一个GWT项目中遇到了同样的问题,并解决了JPA 1/2与geronimo web.xml中javax.persistence的冲突。我遇到了困难,WASCE仍然使用OpenJpa,尽管它是一个SessionFactory(leagacy代码)。因此,我没有使用persistence.xml。因此,我们找到了一种方法,通过添加一个PersistenceProviderResolver来正确覆盖持久性提供程序。
public class HibernateContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce) {
HibernatePersistenceProviderResolver.register();
}
public void contextDestroyed(ServletContextEvent sce) {
// nothing to do here
}
}
<listener>
<listener-class>my.context.listener.HibernateContextListener</listener-class>
</listener>