1
単一のアプリケーションを構築している場合は、コピーする必要はありません。ビジネス コードと Web/ビュー コードを厳密に分離したい場合はear
、 と をejb module
使用して を作成できますweb module
。Web モジュール内のすべてのクラスは、ejb モジュール内のすべてのクラスにアクセスできますが、その逆は当てはまりません。これにより、アプリケーションにレイヤリングが効果的に適用されます。
しかし、この分離に行く必要はありません。また、EJB Bean をサーブレットなどと一緒に単一の戦争に入れることもできます。豆を置く場所に制限はありません。別のパッケージにすることも、サーブレットと同じパッケージにすることもできます。
私が作成したこの例を見たいと思うかもしれません: http://arjan-tijms.omnifaces.org/2011/08/minimal-3-tier-java-ee-app-without-any.html . BusinessBean
単一の war で JSF バッキング Bean と同じ (デフォルトの) パッケージに常駐する EJB があります。
単一の戦争セットアップでは、すべてがすべてにアクセスできます。このような状況でも、おそらくビジネス コードを「クリーン」に保ち、そのようなことを避けたいと考えていることに注意してくださいHttpRequest
。
2
EJB Bean、特に EJB ライトは、ほぼすべての Web アプリケーションが必要とするもの (トランザクション、プーリング、スレッドセーフ、セキュリティ、およびインジェクション) を正確に提供します。JPA と組み合わせると、EJB Bean を最大限に活用できます。利点は、コードの冗長性が大幅に軽減されると同時に、プレーンな JDBC を使用するときに発生する競合状態や矛盾から保護されることです。
例えば
@Stateless
public class CustomerService {
@PersistenceContext
private EntityManager entityManager;
public void addCustomer(Customer customer) {
entityManager.persist(customer);
}
}
EJB がなければ、接続の開閉、トランザクションの開始とコミットなどを行う一連の try/finally ブロックが必要になります。また、JPA を使用しないと、Customer
エンティティに表示されるエンティティの個々のフィールドを挿入する面倒なコードの大きなブロックが必要になります。準備済みステートメントへの例。
(後で) 1 つまたは複数の他のサービスを呼び出すサービスがあり、すべてを DB に保存する必要があるか、(間に未定義のものがあるのとは対照的に) 何も保存する必要がない場合、プレーンな JDBC でこれを達成するのは非常に困難です。開いている接続を渡す必要があり、中間フェーズで使用できるメソッドに加えて、接続を開いたり閉じたり、トランザクションを開始/コミットしたりする各サービス メソッドの特別なバリアントが必要です。やがて、これは非常に複雑になり、泥の塊になります。
EJB では、他の EJB Bean 内から呼び出す EJB Bean のすべてのメソッドは、進行中のトランザクションに自動的に参加するか、進行中のトランザクションがない場合は独自のメソッドを開始します。これだけでも、典型的な Web アプリケーションによって実行される多くの一般的なビジネス タスクが大幅に簡素化されます。
「エンタープライズ アプリケーション」だけがトランザクションを必要とし、Web アプリケーションはトランザクションを必要としないなどと誰にも言わせないでください。これは単に真実ではありません。トランザクションは、主キーや外部キーと同じレベルの基本的な要件で、DB 操作を行う場合の非常に基本的なことです。(Web ショップで) 注文のビジネス ロジックを実行する場合、在庫が減少することは絶対に避けたいと思いますが、実際の注文は送信されません。または、注文は送信されますが、顧客のアカウントからお金が差し引かれることはありません。最も単純なビジネス ロジックには、多くの場合、少なくとも 2 つのテーブルへの書き込みが含まれます。それが発生するたびに、トランザクションを使用することをお勧めします。
ただし、EJB 3 を使用していることを確認してください。EJB 2 に関係するすべてのものから遠ざかってください。約 6 年前から非推奨になっているホーム インターフェースやエンティティ Bean などには触れないでください。(ただし、EJB エンティティ Bean と JPA エンティティを混同しないでください。不幸な名前の類似性にもかかわらず、これらは完全に異なります。JPA エンティティは非常に正気で便利です)