動的 Eclipse プラグインでの Hibernate の使用
-
20-08-2019 - |
質問
アプリケーションに使用するさまざまなプラグイン間でまったく同じ名前のクラスがあり、それらを Hibernate で適切に構成できるようにしたいと考えています。問題は、Hibernate がマッピングを行っているときにクラスを検索しようとすると、クラスのパッケージ名を動的に生成しているように見えることです。1 つのプラグインではこのスキームは機能しますが、複数のプラグインでは機能しません。複数のプラグインにわたる Hibernate 設定ファイルを処理する場合、Hibernate が混乱するようです。
これは各プラグインに独自のクラスローダーがあるためでしょうか?既存のプラグインと Hibernate でこれを機能させるための最善の方法は何ですか?
解決
問題は、すべてのプラグインに独自のクラスローダーがあり、Hibernate がリフレクションを使用して適切なクラスを見つけることです。
まさにこの問題に関する非常に素晴らしい記事が家にありますが、これはドイツ語です。何をする必要があるのか説明していきます。
データ構造を複数のプラグインで共有するには、それをプラグインに入れて、と呼ばれる機能を有効にする必要があります。 バディポリシー。起動時に休止状態を開始するメインアプリケーションプラグインがあるとします。このプラグインはデータ構造プラグインからクラスを「参照」する必要があります。これをする main-plugin はその Buddy-Policy を「registered」に設定し、data Structure-plugin は自身を「buddy」として登録します。. 。残念ながら、これはすべてマニフェスト ファイルで直接行う必要があり、少なくとも 3.3 ではエディタでこれを行う方法はありませんでした。
このバディ ポリシーが機能すると、Hibernate も機能します。
古いアプリケーションを調べて、その方法を以下に示します。
- メインアプリケーション (toolseye.rcp) は、休止状態プラグイン (de.eye4eye.hibernate) とデータ構造プラグイン (toolseye.datastructs) に依存しています。
- Hibernate プラグインは、そのバディ ポリシーを「登録済み」として指定します。
- data Structure-plugin は、自身を Hibernate-plugin に登録します。
重要な行は次のとおりです。
Hibernate プラグイン de.eye4eye.hibernate
Eclipse-BuddyPolicy: registered
データ構造プラグインツールeye.datastructs
Eclipse-RegisterBuddy: de.eye4eye.hibernate
これらの行を MANIFEST.MF に直接記述します。
メイン アプリケーションまたは間にあるレイヤーがそれらを使用できるようにするには、両方のプラグインでパッケージを再エクスポートする必要があります。お役に立てば幸いです。
他のヒント
これを完成させるためだけに。
Hibernate を使用する代わりに、EclipseLink を Eclipse RCP アプリケーションの JPA プロバイダとして使用できます。EclipseLink は Oracle の以前の TopLink であり、JPA 2 のリファレンス実装として選択されています。
RCP のポイントは、EclipseLink が OSGI バンドル (org.eclipse.persistence.jpa) として利用可能であるため、追加のバディ ポリシーなしで別のプラグインからクラスをロードできることです。
現在、次のプロジェクト構造 (モデル-ビュー-プレゼンター パターン) を使用して遊んでいます。括弧内の名前は依存関係プラグインを指定します (すべてが含まれているわけではなく、この質問に関連するもののみです)
- rcp.mvp.view (rcp.mvp.presenter / rcp.mvp.model)
- rcp.mvp.プレゼンター (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のみを提供します。ClassPathの中にある必要があります
- rcp.mvp.model
このシナリオでは、データ プラグインの JPA プロバイダーは、バディ ポリシーなしでモデル プラグインからクラスをロードできます。
*注意: プレゼンターは DAO によってカプセル化されているため、JPA パッケージに依存しません (DAO を依然として使用する主な理由です)。
リンク
- ユーザーガイド
- RCPの例 (残念ながらDAOは使用していません)
- EclipseLinkの概念的なウェビナー live.eclipse.org より