Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何覆盖WebSphereCommunityEdition(WCE)2.1';s默认持久性提供程序-OpenJPA_Java_Spring Mvc_Websphere_Jpa 2.0_Persistence.xml - Fatal编程技术网

Java 如何覆盖WebSphereCommunityEdition(WCE)2.1';s默认持久性提供程序-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

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

<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持久性代码构建到应用程序中——将所有必要的JAR部署到您的应用程序EAR/WAR/CLASSPATH中

    复制hibernate3.jar和lib/required中提供的所需第三方库 将lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar也复制到类路径

  • 为应用程序配置AppServer类加载器顺序-首先加载新的JPA类如果未正确配置类加载器,则应用程序将使用应用程序服务器附带的JPA提供程序,而不是第三方JPA提供程序。

  • 如果您将提供程序捆绑在EAR文件中,则在需要JPA的应用程序模块中 访问时,在中指定第三方持久性提供程序二进制文件 Manifest.mf类路径

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


  • 要在共享库中部署新的JPA提供程序,请执行以下操作:

  • 确保
    persistence.xml
    元素指向新JPA提供程序的
    javax.persistence.spi.PersistenceProvider的实现

  • 在共享库中定义持久性提供程序

  • 如果库被许多应用程序访问,请将共享库与服务器类加载器相关联。否则,请将共享库与应用程序类装入器关联

  • 为应用程序配置类加载器顺序-首先加载新的JPA类如果未正确配置类加载器,则应用程序将使用应用程序服务器附带的JPA提供程序,而不是第三方JPA提供程序。





  • 您可以通过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>