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は、大きく以下の三つの種類のBeansに分けられる。
EJBの簡単な例を以下に示す。
@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層からの呼び出し例である。
@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コンテナの代表例としてJBossなどが挙げられる。またJakarta EEサーバーはEJBコンテナを含んでいる。