4

アプリケーションに使用するさまざまなプラグインでまったく同じ名前のクラスがあり、それらを Hibernate で適切に構成できるようにしたいと考えています。問題は、マッピングを行っているときにクラスを見つけようとすると、Hibernate がクラスのパッケージ名を動的に生成するように見えることです。このスキームは 1 つのプラグインでは機能しますが、複数のプラグインでは機能しません。複数のプラグインにまたがる Hibernate 構成ファイルを処理するときに、Hibernate が混乱するようです。

これは、各プラグインが独自のクラスローダーを持っているためですか? 既存のプラグインと Hibernate を使用してこれを機能させるための最善の方法は何ですか?

4

2 に答える 2

4

問題は、すべてのプラグインに独自の Classloader があり、Hibernate が Reflection を使用して適切なクラスを見つけることです。

まさにこの問題に関する非常に優れた記事が自宅にありますが、これはドイツ語です。私はあなたが何をする必要があるかを説明しようとします。

データ構造を複数のプラグインで共有するには、それをプラグインに入れ、buddy-policyという機能を有効にする必要があります。起動時に休止状態を開始する main-application-plugin があるとします。このプラグインは、datastructure-plugin からクラスを「見る」必要があります。これを行うために、main-plugin はその Buddy-Policy を "registered" に設定し、datastructure-plugin は自分自身を "buddy" として登録します。残念ながら、これはすべてマニフェスト ファイルで直接行う必要があります。少なくとも 3.3 では、エディタでこれを行う方法がありませんでした。

このバディ ポリシーが機能すると、Hibernate も機能します。

古いアプリケーションを調べたところ、これがどのように行われたかです。

  1. メインアプリケーション (toolseye.rcp) は、休止状態プラグイン (de.eye4eye.hibernate) とデータ構造プラグイン (toolseye.datastructures) に依存しています。
  2. hibernate-plugin は、バディ ポリシーを「登録済み」として指定します。
  3. datastructure-plugin は自分自身を hibernate-plugin に登録します

重要な行は次のとおりです。

Hibernate プラグイン de.eye4eye.hibernate

Eclipse-BuddyPolicy: registered

データ構造プラグイン ツールeye.datastructures

Eclipse-RegisterBuddy: de.eye4eye.hibernate

これらの行を MANIFEST.MF に直接入れます

両方のプラグインは、メイン アプリケーションまたは間にあるレイヤーがそれらを使用できるように、パッケージを再エクスポートする必要があります。それが役に立ったことを願っています。

于 2009-07-02T15:54:28.817 に答える
1

これを完成させるためだけに。

Hibernateを使用する代わりに、EclipseLinkをEclipseRCPアプリケーションのJPAプロバイダーとして使用できます。EclipseLinkはOracleの以前のTopLinkであり、JPA2のリファレンス実装として選択されています。

RCPのポイントは、EclipseLinkがOSGIバンドル(org.eclipse.persistence.jpa)として利用可能であり、そのため、追加のバディポリシーなしで別のプラグインからクラスをロードできることです。

現在、私は次のプロジェクト構造(Model-View-Presenter Pattern)を使用して遊んでいました。括弧内の名前は、依存プラグインを指定します(すべてが含まれているわけではなく、この質問に関連するプラグインのみが含まれています)

  • rcp.mvp.view(rcp.mvp.presenter / rcp.mvp.model)
  • rcp.mvp.presenter(rcp.mvp.data-データはモデルを再エクスポートするため、ここでは必要ありません)*
  • rcp.mvp.data(rcp.mvp.data.mysql / rcp.mvp.model / javax.persistence / org.eclipse.persistence.jpa)
  • rcp.mvp.data.mysql -mysql-jdbc-driverのみを提供します。クラスパス内にある必要があります
  • rcp.mvp.model

このシナリオでは、データプラグインのJPAプロバイダーは、バディポリシーなしでモデルプラグインからクラスをロードできます。

*注:これはDAOによってカプセル化されているため、プレゼンターはJPAパッケージに依存していません(これらを引き続き使用する主な理由)

リンク

于 2009-08-12T00:55:03.853 に答える