Enterprise JavaBeans

**Jakarta Enterprise Beans** (**EJB**) とは、Eclipse Foundationが開発している、JavaBeans仕様と同様のものを、ビジネスロジックをモデル化およびデータの永続化のために作成した、ネットワーク分散型ビジネスアプリケーションのサーバサイドで実現した仕様で、Jakarta EE Platformの一部。Java 8までは**Enterprise JavaBeans**という名称で、Java Platform, Enterprise Editionの一部だった。セキュリティ機能などを備える。アプリケーションサーバなどで実装されている。

## 沿革
EJBは元々、OMGのCORBAやサンのRMIといった分散オブジェクトに由来する技術であり、RMIをベースにビジネスロジックを実装するコンポーネントとして誕生した。最初の実装はJavaの誕生から3年後の1998年頃に登場している。こうした経緯から、当初策定されたEJBはリモートアクセスを想定した複雑な実装が必須となっており、デプロイメント記述子と呼ばれるXMLの設定ファイルもかかせないものだった。また、Enterprise JavaBeans 1.0では主要な要素としてセッションBeanのみが定義されており、エンティティBeanはオプションという扱いであった。

2001年9月24日のJ2EE 1.4に含まれるEnterprise JavaBeans 2.0では、EJBが分散オブジェクトとして使われることは稀であるという実情を踏まえ、ローカルインタフェースの追加が行われている。またメッセージ駆動型Beanが仕様に組み込まれた。

しかしEJBの仕様は依然複雑なものであり、EJBに代わってより軽量なSpring FrameworkやPOJOといった考え方を用いる動きが活発化する。こうした流れを受け、2006年5月11日のJava EE 5に含まれるEnterprise JavaBeans 3.0では、DIやPOJOといった考え方を取り入れる形で仕様の全面的な見直しが行われる。EJBの各クラスは単なるPOJOとなり、J2SE 5.0で導入されたアノテーションによりEJBとしての宣言を行う形式とされた。設定ファイルも不要となり、エンティティBeanは独立した永続化フレームワークであるJava Persistence APIに置き換えられた。

2009年12月10日のJava EE 6に含まれるEnterprise JavaBeans 3.1では、シングルトンセッションBeanの追加や、セッションBeanを中心とするコンポーネントのみを抽出したEJB Liteと呼ばれるサブセットの定義が行われた。

2013年5月18日のJava EE 7, 8に含まれるEnterprise JavaBeans 3.2では、非同期処理のEJB Liteへの導入や不要となったエンティティBeanが仕様から取り除かれるなどした。

2019年8月21日、Jakarta Enterprise Beans 3.2をリリース。Jakarta EE 8に含まれる。Enterprise JavaBeans 3.2と同一で名前が変わっただけである。

2020年11月5日、Jakarta Enterprise Beans 4.0をリリース。Jakarta EE 9, 10, 11に含まれる。パッケージ名が javax.ejb から jakarta.ejb に変更になった。

## EJBの種類
EJBは、大きく以下の三つの種類のBeansに分けられる。

;セッションBean (Session Bean)
:セッションを保持し、一時的なロジックを保存するオブジェクト。以下のような種類がある。
:* ステートフルセッションBean (Stateful Session Bean) : クライアントごとの状態 (State) を保持するセッションBean。
:* ステートレスセッションBean (Stateless Session Bean) : クライアントごとの状態を保持しないセッションBean。
:* シングルトンセッションBean (Singleton Session Bean) : 常に同じインスタンスへのアクセスが保証されているシングルトンなセッションBean。
 
;メッセージ駆動型Bean (Message Driven Bean)
:非同期処理の記述など。

;エンティティBean (Entity Bean)
:永続的なデータを保存するオブジェクト。EJB 3.2で廃止。

## 例
EJBの簡単な例を以下に示す。


```java
@Stateless 
public class CustomerService { 
    @PersistenceContext 
    private EntityManager entityManager; 

    public void addCustomer(Customer customer) { 
        entityManager.persist(customer); 
    } 
}
```


上記のコードは、O/Rマッピングを使用して顧客 (Customer) オブジェクトを永続化（DBに保存）するサービスクラス（セッションBean）である。EJBが永続コンテキスト (Persistence context) の管理を行うため、実際にデータを登録するaddCustomer()メソッドは、デフォルトでトランザクション管理されたスレッドセーフなメソッドとなる。上記のコードは、EJBのビジネスロジックと永続化に焦点を当てたもので、EJBの特徴的な機能の数々は使用していない。

こうしたEJBのセッションBeanは、以下のように他のクラスから呼び出して使用することができる。以下はWeb層からの呼び出し例である。


```java
@Named	
@RequestScoped
public class CustomerBacking {
    @EJB 
    private CustomerService customerService;

    public String addCustomer(Customer customer) {
        customerService.addCustomer(customer);
        context.addMessage(...); // （省略）メッセージ出力など
        return "customer_overview";
    }
}
```


上記のコードは、EJBのセッションBeanを@EJBアノテーションにより注入した、Jakarta Faces (JSF) の管理Bean (Managed Bean) である。今度のaddCustomer()メソッドは、UIコンポーネントにおけるボタン操作などを表現している。EJBのセッションBeanとは逆に、この管理Beanにはビジネスロジックに関するコードも永続化に関するコードも含まれていないが、EJBのコードを呼び出すことでそうした処理を実現している。EJBはプレゼンテーション層に依存せず、それらの役割は管理Beanが担う。

## EJBコンテナ
EJBを管理し、動作させるための実行環境はEJBコンテナと呼ばれる。EJBコンポーネントが動作するときに利用するデータベースへのコネクションやトランザクションの管理も同時に行う。

EJBコンテナの代表例としてJBossなどが挙げられる。またJakarta EEサーバーはEJBコンテナを含んでいる。

## 脚注

## 関連項目

* Java Persistence API
* Spring Framework

## 外部リンク
* Jakarta Enterprise Beans 
* Enterprise JavaBeans 

### 仕様
* JSR 905: Enterprise JavaBeans<small><sup>TM</sup></small> Specification Version 1.1, Errata Sheet, 5/4/2000 
* JSR 19: Enterprise JavaBeans<small><sup>TM</sup></small> 2.0 
* JSR 153: Enterprise JavaBeans<small><sup>TM</sup></small> 2.1 
* JSR 220: Enterprise JavaBeans<small><sup>TM</sup></small> 3.0 
* JSR 318: Enterprise JavaBeans<small><sup>TM</sup></small> 3.1 
* JSR 345: Enterprise JavaBeans<small><sup>TM</sup></small> 3.2 
* Jakarta Enterprise Beans 3.2 
* Jakarta Enterprise Beans 4.0