2

永続化の抽象化として JPA を使用するモジュラー (プラグインのような) アプリケーションを作成したいと考えており、このアプリケーションはサード パーティによって拡張可能である必要があります。

問題は、このアプリケーションとそのプラグインを他のデータベース/JPA プロバイダーに簡単に移植できるようにすることです。そのため、サード パーティ ベンダーは、使用されている JPA プロバイダー (またはデータベース接続) について何も知ることができず、永続レイヤーを拡張することしかできません。メインアプリの永続化ユニットに保存される新しいエンティティを定義することにより(これにより、新しいデータベースを指すようにすべてのモジュールを再構成することなく、データベースを切り替えることができます)。

JPAでそのようなことはできますか?.NET の nHibernate (およびおそらく Hibernate) を使用すると簡単に実行できますが、Java EE 環境にいるため、JPA に対してプログラミングすることを好みます。

4

2 に答える 2

1

おかしなことに、OSGi、Equinox、および EclipseLink を使用してこれを正確に作成しましたが、簡単ではありません。基本的に、カスタム バンドルは、解決されたすべてのバンドルからすべての persistence.xml ファイルを取得し、それらを単一の persistence.xml にマージします。このファイルは、EclipseLink Persistence Provider の初期化に使用されます。さらに、いくつかのカスタム フックを使用すると、fe 接続オプションを開発と展開用に個別に指定できます。

欠点: コンテナー管理の永続性にさよならを言いますが、トランザクションに参加することは可能です。また、一部のツールは、クロスバンドル エンティティ参照に激しく反応します。また、新しいエンティティを含む新しいバンドルを追加する場合は、事前に適切なテーブル、参照、インデックス、および制約を使用してデータベースをセットアップする必要があります。

利点: 新しいバンドルをドロップすると、コンテナーを再起動することなく、すぐに動的に動作することがわかります。

于 2010-07-23T13:51:07.570 に答える
0

また、モジュール方式で(NetbeansモジュールシステムまたはOSGIコンテナで)JPAを実行する方法についても調査しています。

注意すべきことの1つは、(中央の永続化モジュールによって)中央の大きなEntityManagerFactoryを構築する必要がある場合、アプリケーションが大きい場合に問題が発生する可能性があることです。

  • 永続化モジュールがモジュールの起動/シャットダウンイベントに反応する必要がある場合、モジュールが追加または削除されたときに中央のEntityManagerFactoryを再構築する必要があります。アプリケーションが大きい場合(クラスが多い場合)、EntityManagerFactoryの再構築には時間がかかり、コストがかかります。

  • モジュールが追加/削除されると古いモジュールが古くなるため、アプリケーションはEntityManagerFactoryへの参照を保存する必要はありません。アプリケーションは、非常に短命のEntityManagerで動作し、常にEntityManagerFactoryを取得する必要があります。

JPAを使用するすべてのモジュールに対してEntityManagerFactoriesを構築する方が柔軟な場合がありますが、モジュールごとにすべてのEntityManagerFactoriesが作成されるまで、より多くのメモリが必要になり、より多くの計算能力を消費する可能性があります(ただし、EntityManagerファクトリはオンデマンドで作成される場合があります)中央JPAサービス)。

Dynamic-JPA(http://www.dynamicjava.org/projects/dynamic-jpa)は、OSGIコンテナーで作業する場合に役立つことがあります。

于 2011-01-04T11:21:49.607 に答える