2009-03-25 14 views
5

I'vに多少の不満があります。 私はOSGiフレームワークとしてApache Felixを使用しています。また、Hibernateを永続性の問題に使用しています。休止状態の "のOSGiバンドル" バージョン(com.springsource.org.hibernate-3.2.6.ga.jar)を用いHibernate、JDBCドライバ、およびOSGiの問題

イム。私が知る限り、これはMETA-INF/MANIFEST.mfにインストールされたいくつかの追加のosgi-metdataを持つHibernate Coreです。この情報(Package-ExportおよびPackage-Import)はosgiシステムにとって不可欠です。

私の問題は、Hibernateのバンドルは私のJDBC-ドライバを見つける傾けることです。 SpringSourceのHibernateバンドルにImportステートメントを追加するのは非常に間違っています。これを解決するにはもっと良い方法があるはずです。

答えて

1

少し前にsimilar problemが発生しました。解決策は、jdbc-providerバンドルとjdbc-userバンドルを「バディ」として登録することでした。これは、明示的に宣言することなく、あるバンドルが別のクラスのクラス(jdbcドライバも同様)を使用できないためです。これはEclipseのためのものだったので、私はそれがあなたを助けるかもしれないと思います。

3

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

は、あなたのバンドルのための適切な開始レベルを設定し、それが動作するかどうかを確認してください。具体的には、まず、JDBCドライバを使用してバンドルを起動してから、hibernateバンドルを起動する必要があります。

また、未解決の依存関係がある可能性があります。すべてが存在することを確認してください。これを行うには、OSGiコンソールを取得し、サービスのリストを要求します。 Equinoxでは、これはOSGiシェルの-consoleコマンドライン引数と "ss"コマンドの後ろに "diag"コマンドが続きます。

EDIT(コメントへの答え):

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

+0

しかし、私は休止状態バンドルは、これまで明確にせずに、正しいJDBCドライバを見つける方法を見カントインポートする。 org.embedded.derbyまたはorg.mysql.jdbc .. –

+0

あなたは休止状態のバンドルのソースを持っていますか?マニフェストを見て、どのアクティベータクラスを参照してください。そして、このクラスを見ると、これはおそらくあなたの質問 – paweloque

+0

に答えてくれるでしょう。「Hibernateはおそらくそのインターフェースでドライバを検索し、特定のドライバクラスをインポートする必要はありません。これは、Hibernateバンドルに特定のJDBCドライバを設定するためのAPIがあることを意味しますか? (例えば、mysql-jdbcを設定し、oracle-jdbcを設定するなどしないと、hibernateが正しいドライバを取得する方法がわかりません) –

7

HibernateはHibernateはもはやのOSGiコンテナで真でないクラスの可視性にする想定の多くは非常に良いOSGiの市民ではありません。

Class.forName(<jdbc class name>)でJDBCドライバをロードする通常の方法は、OSGiの内部では動作しません。この場合、Hibernateはドライバを試してロードしますが、Hibernateはドライバをロードしようとしないため、 JDBCドライバー・パッケージをインポートします。

JDBCドライバマネージャはまた、呼び出し元のクラスのクラスローダがドライバを参照してくださいする必要があるかどうか外に取り組んでスマートにしようとすると、これはまた、OSGiのと矛盾します。

Springを使用してHibernateを設定する場合は、SimpleDriverDataSourceクラスをOSGiで使用することをお勧めします。Springでは、Hibernateがインスタンス化する必要があるクラス名を渡すのではなく、具体的なデータソースでHibernateを設定できます。

あなたがその問題を乗り越えるたら、おそらくあなたのドメインクラスを見ていない休止状態の問題に実行されます。私はXMLマッピング手法の経験があるだけですが、OSGiではアノテーションの方法にはAOP織りが必要だと思うので、OSGiではもっと簡単だと思っています。

現時点では、SpringのDB2サーバーのようなものを使用しない限り、Javaのクラス・ローディング・メカニズムと、OSGiのサービスへのアプローチをどのように使用してバニラJavaとOSGiの非互換性世界。

具体的には、エンタープライズライブラリがコンテキストクラスローダーをどのように使用するか、またどのように管理できるかを調べてください。私は、コンテキストクラスローダを簡単に制御できるように、Spring dmを使用してOSGiサービスのレガシーコードをラップしています。

3

OSGiバンドルでは、インポートしたパッケージのクラスとリソースしか見ることができません。 Hibernateバンドルはあなたのドメインクラスをインポートしません。したがって、HibernateはXMLマッピングファイルを処理しようとすると、マップされているクラス(あなたのドメインクラス)を見つけることができないと不平を言うでしょう。

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

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

1

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

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

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

私は断片は9ヶ月前フェリックスによってフルにサポートされていなかった疑いがあるが、彼らは確かに、今それはそうされています http://osgithoughts.blogspot.com/2009/09/felix-now-fully-supports-osgi-fragments.html

+0

OSGiの人たちからの推奨は、フラグメントを使ってこのルートを下りたり、それらの初期の意図に制限することではありません。これに関するEclipseLinkの人たちから浮かび上がっています(現時点でリンクを思い出すことはできません)。 – SteveD

関連する問題