0

JPA を使用したコードがあり、開発環境と単体テストですべて正常に動作します。しかし、私のモジュールを OSGi ターゲット環境にデプロイすると、最も奇妙なクラスのロードの問題に定期的に遭遇します。私は OSGi が本当に好きですが、これを完全に修正できない場合は、ひどく狂ってしまいます。そして、どのクラスが他のどのクラスから見える必要があるかを理解していない限り、OSGi を適切にセットアップすることはできません。

したがって、私が見る限り、実行中のコードの一部から見える場合と見えない場合がある次の項目があります。それらを「サブジェクト」と呼びましょう。

  • JPA アノテーション付きエンティティークラス
  • apersistence.xml
  • の持続性 APIjavax.persistence
  • 永続化プロバイダ クラス

そして、私のコードには次のような状況があります:

  • とを作成EntityManagerFactoryするEntityManager
  • 新しいエンティティ オブジェクトをインスタンス化する
  • これらのオブジェクトを に渡しEntityManagerて、永続化コンテキストに入れます
  • それらを使用し続け、時々 EntityManager に変更を保存するように依頼します
  • エンティティ オブジェクトをデータベースに保存したり、明示的に EntityManager のメソッドを呼び出したりせずにインスタンス化、使用、および破棄する
  • エンティティ オブジェクトをインスタンス化する代わりに、EM にデータベースからそれらをロードするように依頼します。これにより、インスタンス化が見えない場所で発生します。
  • これらのインスタンスの使用、変更、保存、破棄

では、上記のどの状況で、どの被写体を表示する必要があるのでしょうか?

おそらくそれは明らかだと思います

  • 持続性プロバイダーとエンティティークラスは、javax.persistence を認識している必要があります
  • EntityManager を作成するコードは、javax.persistence を参照する必要があります (そして、永続化プロバイダーを推測しますが、それは私自身のコードのいずれにも直接表示されません)。
4

1 に答える 1

1

次のバンドルを作成します。

  • モデル (JPA アノテーション付きクラス)
  • ライブラリ (javax.persistence)
  • DAO (persistence.xml、永続化プロバイダー クラス)
  • 事業コード

可視性:

  • モデルのインポートとエクスポート Lib
  • DAO は Model (したがって Lib) をインポートします。DAO は EM とモデルの検索方法をエクスポートします。
  • ビジネス コードは DAO をインポートします

[編集] OSGi クラスローディングがどのように機能するかを理解しなければなりません: 2 つのバンドル A と B があり、両方が C で使用されている場合、A は B を見ることができず、B は A から何も見ることができません。C は見ることができます両方。

ここで、A と B はライブラリ バンドル X を使用します。A が X から何らかのインスタンスを作成し、それを C に渡し、C がそれを B に渡すと、A からの X は B からの X と同じではないため、エラーが発生します。 X は外界から完全にカプセル化されています。

Java 用語: X のクラスは異なるクラスローダーを使用して作成され、名前が同じであっても、異なるクラスローダーのクラスが同じになることはありません。

これが、2 つの異なるパスから X をインポートすることを避ける必要がある理由です。

于 2009-10-13T15:15:20.190 に答える