2

Enterprise Java開発にまったく慣れておらず、のチュートリアルを読んだ後、最初のセッションBeanを開発することができました。セッションBeanについて少し読んだ後、それ(セッションBean)についていくつか質問があります。ここにいる専門家が私を助けてくれることを願っています。

通常、EJBを使用しないサーブレットシナリオでは、特定のタスクを実行するために次のようなことを行います。

 StudentList stud = businesslayer.businessMethod_GetStudentsFromDb(); 

これで、ビジネスレイヤーはサービスレイヤーを呼び出し、DBから詳細を取得して返します。

今私の質問は次のとおりです:

1-ステートレスEJBを使用してこのメ​​カニズムを実装する場合、ドメインオブジェクトStudentListを含むドメインパッケージをエンタープライズプロジェクトの「-ejb」フォルダにコピーする必要があります(netbeansを使用しています)。同様に、 「-war」フォルダのソースフォルダからejbフォルダに他のビジネスメソッドをコピーして、「-ejb」フォルダ内のステートレスBeanがそれらのメソッドを使用できるようにします。「-ejb」フォルダー内のカントクラスは、「-war」フォルダーのソースフォルダー内のクラスを使用します。

2-これは私が理解できなかったこれまでの質問です。現在のメカニズムの代わりにEJBを使用した場合、どのような利点がありますか?

4

1 に答える 1

4

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 エンティティは非常に正気で便利です)

于 2012-07-14T16:03:28.010 に答える