5

ややイライラする問題に遭遇しました。OSGi フレームワークとして Apache Felix を使用しており、永続性の問題のために Hibernate も使用しています。

Hibernateの「osgi-bundle」バージョン(com.springsource.org.hibernate-3.2.6.ga.jar)を使用しています。私の知る限り、これは META-INF/MANIFEST.mf に追加の osgi-metdata がインストールされた Hibernate Core です。この情報 (Package-Export および Package-Import) は、osgi システムにとって不可欠です。

私の問題は、Hibernate バンドルが JDBC ドライバーを見つけられないことです。import ステートメントを springsource Hibernate バンドルに追加するのは非常に間違っているように感じます。これを解決するためのより良い方法があるはずです。

4

5 に答える 5

3

正しいバンドル開始順序に注意しましたか? システムが正しくブートストラップできるように、すべてのバンドルの開始レベルを設定する方法があります。一部のアクティベーターがサービスを直接取得しようとする場合、バンドルの正しい開始レベルが必要になる場合があります。サービスが利用できない場合、サービスの利用者は立ち往生するだけです。

バンドルに適切な開始レベルを設定して、それが機能するかどうかを確認してください。具体的には、休止状態バンドルの前に、最初に JDBC ドライバーを含むバンドルを開始する必要があります。

もう 1 つの問題は、未解決の依存関係があることです。すべてがそこにあることを確認してください。これを行うには、OSGi コンソールを取得し、サービスのリストを要求します。Equinox では、これは -console コマンドライン引数と、OSGi シェルの「ss」に続く「diag」コマンドに要約されます。

編集(コメントへの回答):

ドライバーは、インターフェースによって登録されます。その後、Hibernate はおそらくそのインターフェースによってドライバーを検索します。特定のドライバー クラスをインポートする必要はありません。とにかく、これは実装固有のクラスへの望ましくない依存関係をもたらします。

于 2009-03-25T17:06:57.737 に答える
3

OSGi バンドルでは、インポートしたパッケージのクラスとリソースのみを表示できます。Hibernate バンドルは、ドメイン クラスをインポートしません (そしてすべきではありません)。したがって、Hibernate が XML マッピング ファイルを処理しようとすると、マッピングされているクラス (ドメイン クラス) が見つからないというエラーが表示されます。

Equinox のバディ ポリシーを使用して問題を回避し、ドメイン オブジェクトを提供するすべてのバンドルが Hibernate のクラスローディング バディになるようにします。私はこのアプローチがあまり好きではありませんが、頭の中にある (できれば) エレガントなソリューションを書く時間がありません。

以前の投稿で述べたように、コンテキスト クラス ローダーを操作することは、Hibernate に関して長期的にはおそらく最善の方法です。

于 2009-07-01T12:26:21.843 に答える
1

私はこれを試したことはありませんが (私は RDBMS 反対であり、ORM 反対でもあります)、OSGi フラグメントを使用するのが 1 つの解決策かもしれません。

ドメイン クラスを含むフラグメントを作成し、Hibernate バンドルをホストとして指定します。このフラグメントは、ドメイン クラスのパッケージをエクスポートする必要があります。

同様に、使用したい JDBC ドライバーに対しても同じことができます。ドライバー クラスを取得し、ホスト バンドルとして Hibernate を使用して OSGi フラグメントに変換します。ただし、ドライバーのパッケージは Hibernate バンドルでのみ使用されるため、エクスポートする必要はありません。

フラグメントは 9 か月前に Felix によって完全にサポートされていなかったのではないかと思いますが、今では確かにサポートされているようです: http://osgithoughts.blogspot.com/2009/09/felix-now-fully-supports-osgi-fragments.html

于 2010-01-02T15:49:22.060 に答える
1

少し前に同様の問題に遭遇しました。解決策は、jdbc-provider バンドルと jdbc-user バンドルを「仲間」として登録することでした。これは、明示的に宣言しないと、あるバンドルが別のバンドルのクラス (jdbc ドライバーも同様) を使用できないためです。これはEclipse用だったので、役立つと思います。

于 2009-05-07T17:53:42.510 に答える