Unmanaged JPAを使用して 1 つのエンティティを永続化しようとするEquinox EclipseとHibernate/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 日以上費やしていますが、何が問題なのかわかりません。