Jakarta EE 10 の学習 - address-bookの理解5 ContactFacadeクラス -

記事
IT・テクノロジー
この記事では address-book アプリケーションの ContactFacade クラスの内容を理解する。

ContactFacade クラス

このクラスは Enterprise Bean の1つのタイプであるステートレスセッションビーン(Stateless Session Bean) として Stateless アノテーションで指定されている。このクラスにはCONTACT データベーステーブルの操作を実行するためのメソッドが定義されている。
インスタンスの生成と破棄はアプリケーションサーバーによって管理され、メソッドの実行時に必要なインスタンスが用意される。
Enterprise Bean は主にアプリケーションのロジック部分を担当するクラスとして使用される。 ステートレスセッションビーンはインスタンスのメソッド実行の前後でインスタンスの状態が保たれない。
複数のメソッド実行の間でインスタンスの状態を保ちたい場合はステートフルセッションビーンを使用する。 (Statefull アノテーションで指定する)

address-book アプリケーションでは、このクラスは ContactController クラス定義内で EJB アノテーションを使ってオブジェクトへの参照をインジェクトして使用されている。

因みにこのクラスを Enterprise Bean とせずに、CDI Managed Bean を使うこともできる。ただしその場合にはデータベースとのトランザクションに必要なトランザクションコンテキストが作られないため、クラス定義に Transaction アノテーションを付加する必要がある。
詳しくは Jakarta Transactions の仕様書を参照。

EntityManager インスタンス

Entityマネージャインスタンスを作るときには PersistenceContext アノテーションを使用する。unitName属性でマネージャが所属する Persistence ユニットの名前を指定する。(Persistence ユニットは persistence.xml ファイルで定義している)

以下では ContactFacade クラスの親クラスの主なメソッドをそれぞれ確認する。

public void create(Contact entity)
EntityManager インスタンスの persist(entity) メソッドを実行する。
データベーステーブル CONTACT に entity に対応する行データが挿入される。

public void edit(Contact entity)
EntityManager インスタンスの merge(entity) メソッドを実行する。
entity に対応する行データの更新が行われる。

public void remove(Contact entity)
EntityManager インスタンスの remove(entity) メソッドを実行する。
entity に対応する行データが削除される。

public Contact find(Object id)
EntityManager インスタンスの find(Contact.class, id) メソッドを実行して、プライマリキーが id に対応する Contact インスタンスを返す。
Contact のプライマリキーは Long 型なので、id にはLong 型の値が使われる。

Criteria API

下記のメソッドは Criteria API を利用してデータベースにクエリを送る操作を実行する。

public List<Contact> findAll()
CONTACT テーブルの全てのデータをContact インスタンスの List として返す。

public List<Contact> findRange(int[] range)
range 配列で指定した範囲のデータのみを Contact インスタンスの List として返す。

public int count()
CONTACT テーブルのデータ行数を返す。

Criteria API はJakarta Persistence の仕様書で定義されているが、API を学習するにはまず JPQL (Jakarta Persistence Query Language) から学習した方が理解がしやすいと思われる。
JPQL も同じく Jakarta Persistence の仕様内に含まれている。JPQL はSQL と似たクエリ文字列を使用する。

Jakarta Persistence Query Language (JPQL)

JPQLのクエリ作成には Entity Manager の createQuery メソッドを使う。
(クエリ文字列が固定でプログラム中で動的に変更されない場合には createNamedQuery メソッドを使う方法もある)

例えば上の findAll メソッドをJPQL を使うように変更するには、メソッド定義を下記のように変更する。
        EntityManager em = getEntityManager();  // Entity マネージャの取得
        String qs = "SELECT o " + "FROM Contact o";   // クエリ文字列の定義
        Query query = em.createQuery(qs, entityClass);   // Query の作成
        return query.getResultList();      // 結果を List として取得して返す

JPQL のクエリ文字列 "SELECT o FROM Contact o" の o は Contact クラスのオブジェクトを表している。(使う文字は o でなくても良い)

COUNT でデータ数を取得するには下記のようなクエリ文字列を使う。
"SELECT COUNT(o) FROM Contact o"

Criteria API と JPQL の詳しい説明は別の機会に譲ることにする。

参考資料:
"Jakarta Persistence 3.1" の仕様書
"Jakarta Enterprise Beans 4.0" の仕様書
"Jakarta Transactions 2.0" の仕様書

JPQL とCriteria API については仕様書と合わせて例えば "Pro Jakarta Persistence in Jakarta EE 10" という書籍を参考にすると良いと思われる。

コメント: 記事内の情報は著者が個人的に調べた範囲で理解しているものです。必要に応じて訂正する場合があります。記事中に含まれるURL はプロトコルを含めると禁止ワードに引っ掛かるので省いています。

著者・投稿者: ENARTS05
編集履歴:
2023/11/4 作成
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す