最近、私が勤務している会社で同様の経験をしました。残念ながら、プロセスに関する決定的なガイドは見つかりませんでした。私たちが見つけたのは、あちこちに部分的なガイドでした。他の人がこの問題にどのように対処したかはわかりません。他の解決策がここに投稿されているかどうかを知りたいと思っています. ただし、私たちがそれをどのように処理したかをお話しし、私たちの経験から学ぶことができることを願っています.
最初から、使用する Spring (およびこの場合は Hibernate) のバージョンを制御できるようにしたいと考えていました。当然のことながら、NetBeans IDE に組み込まれているバージョンは少し古いため、サーバー コードを開発するときに最新のものを利用できるようにしたかったのです。
最終的に、2 つの個別のプロジェクトを作成することになりました。1 つはサーバー コード (サービス、DAO、およびドメイン エンティティ) 用で、もう 1 つはクライアント アプリケーション用です。次に、サーバー コードを jar にまとめ、jar とその依存関係をクライアント プロジェクトにコピーし、それらの jar を依存関係としてクライアント コードにリストしました。私たちは NetBeans プロジェクトで SpringHibernate と呼ばれるモジュールを作成しました。これはこれらの jar を格納し、他のほとんどすべてのモジュールが依存していました。
NetBeans プロジェクトに追加する前に、jar のバージョン番号を削除する ant タスクを作成することをお勧めします。これにより、クライアント コードが違いを認識しなくても、サーバー コードで jar をシームレスに更新できます。(NetBeans は、jar の削除と再追加を開始するときに、ちょっとうるさい場合があります。)
最初の主要なタスクは、applicationContext.xml をロードしてコンテキストから Bean を返すことができる Util クラスを作成することです。そのプロセスはここで概説されています。
私たちが遭遇した主な障害の 1 つは、セッション (JPA 用語では EntityManager) の作成でした。NetBeans プラットフォームは高度にスレッド化された環境であり、EntityManager は単一のスレッドでのみ動作するように設計されています。これを回避するために、Open Session In View ルートを使用しました*。同じ EntityManager を、それを要求した任意のスレッドにロードできるクラスを作成しました。次に、実際の Spring 管理サービスを呼び出す前に EntityManager をそのスレッドにロードするサービスのクライアント プロキシを作成しました。クライアント プロキシ サービスを作成することの追加のボーナスは、アノテーションをLookup.getDefault().lookup(Service.class)
介してそれらを見つけることができることでした。@ServiceProvider
次に、アプリケーションのシャットダウン時に EntityManager と EntityManagerFactory を破棄して閉じることができるカスタム LifeCycleManager を作成する必要があります。
これが役立つことを願っています!
*Open Session in View がアンチパターンとしてラベル付けされていることは知っていますが、それに関連する問題を理解している限り、それらの問題を軽減できます (時間の経過とともに変化する可能性が低いオブジェクトをキャッシュする、スマートなデータベース呼び出しを行うなどによって)。 .)。さらに、調査中に Gavin King によるフォーラムへの投稿を見つけたのを覚えています。これは、Open Session In View がクライアント アプリケーションの推奨ルートであると述べています。もちろん、今は投稿を見つけることはできませんが、どこかにあります。