2

Unmanaged JPAを使用して 1 つのエンティティを永続化しようとするEquinox EclipseHibernate/JPAを使用して2 つの OSGI バンドルを開発しています。

最初のバンドル: "Testhibernate" は、hibernates jar からすべてのパッケージをエクスポートするバンドルであり、OSGI サービスを登録し、Equinox タグEclipse-BuddyPolicy: registeredも使用するアクティベーター " org.hibernate.osgi.HibernateBundleActivator " を持っています。

2 番目のバンドル: "TesthibernateConfigDAO" には最初のバンドルに対する依存関係があり、Manifest.mf ファイルにもEclipse-RegisterBuddy: Testhibernateというタグがあり、persistence.xml ファイルをリンクしています。

OSGI Equinox コンテナーで両方を実行するときのこの 2 番目のバンドルでは、メソッドを使用する場合:

emf = Persistence.createEntityManagerFactory("PersistenceProcessDataUnit");

次に、EntityManagerFactory を取得し、エンティティをデータベースに永続化して、すべてOK です

しかし、私は公式の休止状態のWebサイトで次を読みました:

17.4.3. EntityMangerFactory の取得

hibernate-osgi は、OSGi 環境に固有の EntityManagerFactory をブートストラップおよび作成する JPA PersistenceProvider インターフェース名を使用して、OSGi サービスを登録します。EMF を手動で作成するのではなく、サービスを通じて取得することが重要です。このサービスは、OSGi ClassLoader、検出された拡張ポイント、スキャンなどを処理します。EntityManagerFactory を手動で作成しても、実行時に機能しないことが保証されています。

サービスを検出して使用する方法の例については、unmanaged-jpa QuickStart の HibernateUtil.java を参照してください。

だから私はこれで EntityManagerFactory を取得しようとします:

Bundle thisBundle = FrameworkUtil.getBundle( HibernateUtil.class );
BundleContext context = thisBundle.getBundleContext();

ServiceReference serviceReference = context.getServiceReference( PersistenceProvider.class.getName() );
PersistenceProvider persistenceProvider = (PersistenceProvider) context.getService( serviceReference );
emf = persistenceProvider.createEntityManagerFactory( "PersistenceProcessDataUnit", null );

私はこれをデバッグし、サービスとpersistenceProviderオブジェクトを正しく取得しましたが、EntityManagerFactoryを取得しようとして最後に実行すると、エラーが発生します:

org.osgi.framework.BundleException: バンドル TesthibernateConfigDAO の testhibernateconfigdao.HibernateJpaActivator.start() で例外が発生しました。org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734) で org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) で org.eclipse .osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390) org.eclipse.osgi.framework .internal.core.Framework.resumeBundle(Framework.java:1176) org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559) at org.eclipse.osgi.framework.internal.core .StartLevelManager.resumeBundles(StartLevelManager.java: 原因: javax.persistence.PersistenceException: Unable to configure EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:387) at org.hibernate.osgi.OsgiPersistenceProvider.createEntityManagerFactory(OsgiPersistenceProvider.java:83) at de. org.eclipse.osgi.framework.internal で.core.BundleContextImpl$1.run(BundleContextImpl.java:711) at java.security.AccessController.doPrivileged(Native Method) at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) . .. 12 以上 原因:org.hibernate.ejb.Ejb3Configuration.addScannedEntries( Ejb3Configuration.java:506 ) で org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan( Ejb3Configuration.java:477) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:363) ... 19 詳細

そして、公式ドキュメントを読むのに 3 日以上費やしていますが、何が問題なのかわかりません。

4

2 に答える 2

1

あなたのセットアップは機能しません。EMF を作成できるのは、ユニットの説明を含む persistence.xml が、エンティティ マネージャー ファクトリを作成するコードからアクセスできる場合のみです。この場合、persistence.xml を含まないバンドルにファクトリを作成します。NPE はおそらく、Hibernate コードで BundleWiring.listResources への null チェックが欠落している結果です (もちろんバグです) が、これは永続ユニット記述ファイルにアクセスできないという単なる結果です。

TestHibernate バンドルにエンティティ マネージャ ファクトリを作成し、EMF をサービスとして登録する必要があります。その後、DAO バンドルはこのサービスを検索して、そのアクションを実行できます。

ところで、これは、OSGi 仕様が与えられた OSGi 準拠のソリューションが機能する方法でもあります。Gemini JPAダウンロードの例を見て、JPA と JNDI に関連する OSGi 仕様を読むことをお勧めします ( OSGi Allianceサイトからダウンロード)。しかし、おそらくあなたはすでにこれを行っています。

于 2013-12-01T13:39:20.793 に答える