0

データベースと通信する OSGi 動的バンドルを作成しています。非 OSGI アプリケーションで使用した Hibernate を使用しています。オリジナルの hibernate jar を OSGi プロジェクトの lib ディレクトリに置き、それらの jar がプロジェクトのビルド パスとランタイム クラスパスにあることを確認し、OSGi バンドル jar のルートにすべての構成ファイル (つまり、hibernate-cfg.xml) をコピーしました。 . OSGi コンテナー内でバンドル (JAR) を実行すると、hibernate-cfg.xml ファイルが見つからないというエラーがスローされます。

多分誰かがそれを行う方法の良い例を知っていますか?

現時点では、次のエラーが発生しています

2013-10-14 14:56:10 エラー HibernateUtil:41 - SessionFactory の作成に失敗しました: org.hibernate.HibernateException: /hibernate.cfg.xml が見つかりません

前もって感謝します

4

1 に答える 1

0

次の手順に従ってください。

  1. hibernate.org(現在はHibernate4.3.0Final)でHibernate zipファイルをダウンロードしますが、Hibernate 4.2.8FinalでOKをテストします

  2. プロジェクト A を osgi プロジェクトとして作成します: (プロジェクト A には Hibernate osgi ローダーと hibernate ライブラリが含まれ、エンティティ クラスはなく、hibernate.cfg.xml はありません) hibernate-release-4.2.8.Final.zip をディレクトリに展開し、 \hibernate-release-4.2.8.Final\project\hibernate-osgi\src\main\java のパッケージ ソース (org....) をプロジェクト A の src にコピーします。

     Setup Activator class:  (MANIFEST.MF)
      Bundle-Activator: org.hibernate.osgi.HibernateBundleActivator
    
     Create directory 'libs/hiber-4.2.8' in project A:
     Copy All <DIR>\hibernate-release-4.2.8.Final\lib to your 'libs/hiber-4.2.8',
    

バンドル クラスパスを設定: (MANIFEST.MF)

    Bundle-ClassPath: .,
     libs/hiber-4.2.8/jpa/hibernate-entitymanager-4.2.8.Final.jar,
     libs/hiber-4.2.8/optional/ehcache/ehcache-core-2.4.3.jar,
     libs/hiber-4.2.8/optional/ehcache/slf4j-api-1.6.1.jar,
     libs/hiber-4.2.8/required/antlr-2.7.7.jar,
     libs/hiber-4.2.8/required/dom4j-1.6.1.jar,
     libs/hiber-4.2.8/required/hibernate-commons-annotations-4.0.2.Final.jar,
     libs/hiber-4.2.8/required/hibernate-core-4.2.8.Final.jar,
     libs/hiber-4.2.8/required/hibernate-jpa-2.0-api-1.0.1.Final.jar,
     libs/hiber-4.2.8/required/javassist-3.18.1-GA.jar,
     libs/hiber-4.2.8/required/jboss-logging-3.1.0.GA.jar,
     libs/hiber-4.2.8/required/jboss-transaction-api_1.1_spec-1.0.1.Final.jar

エクスポート パッケージを設定します。

Export-Package: javax.persistence,
org.hibernate,
org.hibernate.annotations,
org.hibernate.cfg,
org.hibernate.criterion,
org.hibernate.dialect,
org.hibernate.dialect.function,
org.hibernate.exception,
org.hibernate.internal.util,
org.hibernate.jdbc,
org.hibernate.mapping,
org.hibernate.osgi,
org.hibernate.property,
org.hibernate.service,
org.hibernate.tool.hbm2ddl,
org.hibernate.type     

==> プロジェクト A (Osgi プロジェクト) の準備が整いました。

  1. Osgi プロジェクト B をプロジェクト B に作成します。プロジェクト B には、Entity クラス、ファイル hibernate.cfg.xml 、B osgi で宣言できる Jdbc ドライバーのライブラリがあります。

    Bアクティベーターでは:

    public void start(BundleContext bundleContext) throws Exception {
        Activator.context = bundleContext;
        this.loadOsgiHibernateService(bundleContext);
    }
    
    private void loadOsgiHibernateService(BundleContext bundleContext) {
    
        ServiceReference<?> ref = context
                .getServiceReference(SessionFactory.class.getName());
        if (ref != null) {
            SessionFactory factory = (SessionFactory) context.getService(ref);
                    // Ready session factory. 
                    Session session= factory.getCurrentSession();
                }
    } 
    
于 2014-01-12T08:40:18.537 に答える