EJB3ビジネスロジックパターン&慣行
-
05-07-2019 - |
質問
EJB3(アプリおよびWebサービスレイヤーにはHibernate + Glassfish、Web UIにはLift on Glassfish)を使用して、Javaで多層金融処理アプリケーションを開発中です。質問に苦労しています。ビジネスロジックを配置する場所。
このプロジェクトが始まったとき、最初の概念は、ビジネスロジックの大部分をステートレスセッションBeanに入れることでした。しかし、時間が経つにつれて、EJBフレームワークによって提供される依存性注入が制限しすぎることがわかったため、多くのビジネスロジックは、ステートレスセッションBeanの@PostConstructメソッドでGuiceによってアセンブルされるPOJOになりました。 。この進歩により、セッションBeanとPOJOの間のビジネスロジックが断片化され、これを修正するためのアプローチを見つけようとしています。
最初は、Web層にセッションBeanのリモートインターフェースを使用して、UIと@WebService注釈付きステートレスセッションBeanによって提供されるWebサービスレイヤーの両方からアクセス可能ないくつかの機能を実行させました。これは、永続性とパフォーマンスの観点からは悪夢であることが判明しました。エンティティグラフが非常に大きくなり、分離されたエンティティグラフを永続性コンテキストに再アタッチするとエラーが発生しやすくなるため、ソリューションはオブジェクトの受け渡しを開始することでしたエンティティは、必要に応じてデータベースからエンティティを検索し、検索します。
私の基本的な質問は次のとおりです。ビジネスロジックをセッションBeanに入れるかPOJOに入れるかを決定するために、どのような原則とガイドラインを提案できますか?複雑なオブジェクトグラフが与えられた場合、エンティティBeanを渡すのはいつ意味がありますか?
解決
JPA、EJB3、およびWicketを使用してwebappを構築しているときにこれに苦労しました。繰り返しクエリを使用してデータベースに激しくヒットする方が、メモリ内に多数の大きなエンティティを保持するよりもスケーラブルなので、エンティティ自体ではなくIDのみを渡すことにしました。
Wicketとモデルの概念は、この決定に大きく関係していました。それらのloadableDetachableModelは、IDを保持したまま、使用されていないエンティティをクリーンアップします。私の場合、ステートレスセッションBeanを呼び出すことで、エンティティが再度必要になったときにエンティティを取得する方法を知っているload()メソッドが実装されています。そして、persist()メソッドはステートレスBeanを呼び出して変更を永続化します。このモデルクラスは、実際に渡すものです。 Wicketは表示と入力の検証に関連するロジックのみを処理し、ejbをモデルクラスに挿入するだけです。おそらく、アプリで似たようなものを作成することができます(リフトが提供するものがわからない...)。
これはうまく機能しましたが、特に複雑なビジネスロジックはなく、永続化する必要のある変更を小さな単位のロジックと単一ページに分離できます。
他のヒント
多くの「システム」が必要なときはいつでもサービス(インジェクションなど)はステートレスBeanを使用します。 それ以外の場合-POJO。 POJOははるかに柔軟です。
ただし、単純な(アクセサ?)メソッド(WebサービスやBeanなど)では、単純な作業をいくつか実行して結果を返すことができます。