2

WebSphere CommunityEdition2.1で実行されているSpring3MVCプロジェクトで、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

私は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>
4

3 に答える 3

1

アプリケーションの一部として新しいJPAプロバイダーをデプロイするには:

  1. persistence.xml <provider>要素が新しいJPAプロバイダーのの実装を指していることを確認しjavax.persistence.spi.PersistenceProviderます。

  2. 新しいJPA永続性コードをアプリケーションにビルドします-必要なすべてのjarをアプリケーションのEAR/WAR/CLASSPATHにデプロイします。

    hibernate3.jarと、lib/requiredで利用可能な必要なサードパーティライブラリをコピーします。lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jarもクラスパスにコピーします。

  3. アプリケーションのアプリサーバークラスローダーの順序を構成します。最初に新しいJPAクラスをロードします。 クラスローダーが適切に設定されていない場合、アプリケーションサーバーに含まれているJPAプロバイダーが、サードパーティのJPAプロバイダーではなくアプリケーションによって使用されます。

  4. プロバイダーをEARファイルにバンドルした場合、JPAアクセスを必要とするアプリケーションモジュールで、Manifest.mfクラスパスにサードパーティの永続性プロバイダーのバイナリを指定します。

    プロバイダーをWARファイルにバンドルした場合は、必要なプロバイダーバイナリをWebアプリケーションのWEB-INF/libディレクトリに含めます。

共有ライブラリ内に新しいJPAプロバイダーをデプロイするには:

  1. persistence.xml <provider>要素が新しいJPAプロバイダーのの実装を指していることを確認しjavax.persistence.spi.PersistenceProviderます。

  2. 共有ライブラリで永続性プロバイダーを定義する

  3. ライブラリが多くのアプリケーションによってアクセスされる場合は、共有ライブラリをサーバークラスローダーに関連付けます。それ以外の場合は、共有ライブラリをアプリケーションクラスローダーに関連付けます。

  4. アプリケーションのクラスローダーの順序を構成します。最初に新しいJPAクラスをロードします。 クラスローダーが適切に設定されていない場合、アプリケーションサーバーに含まれているJPAプロバイダーが、サードパーティのJPAプロバイダーではなくアプリケーションによって使用されます。

Websphere8JPAプロバイダー構成
Hibernate3.5構成
WASCE-クラスのロード順序をオーバーライドする
WASCE2.0-Hibernateを含むフレームワークを使用

于 2012-11-05T08:38:25.287 に答える
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>
于 2012-11-19T10:01:43.173 に答える
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"
    />

また、すべての休止状態の.jarライブラリをパッケージlibフォルダー(.warまたは.ear)に追加し、サーバーのクラス読み込みポリシーをデフォルトの親ファーストではなく親ラストに変更するよりも、ドメインマネージャーコンソールを使用して変更できます。 (Dmgr):

サーバー>$SERVER_NAME>サーバー固有のアプリケーション設定

サーバーを再起動すると、これでうまくいくはずです。

よろしく。

于 2012-10-31T16:40:13.217 に答える