Jakarta EE 10 の学習 - address book の理解3 Persistence Unit -

記事
IT・テクノロジー
この記事では address-book アプリケーションで使用している Jakarta Persistence についての概要と設定内容を理解する。

Jakarta Persistence を使ってアプリケーションでリレーショナルデータベースを利用するには下記のような準備が必要となる。
・Entity クラスの定義
・Entity マネージャインスタンスの作成
・Persistence Unit の設定

Entity クラスの定義

Entity はデータベースのテーブルを Java のクラスとして表現するもので、このクラスのそれぞれのインスタンスメンバ変数がテーブルの各列に対応する。
つまり、Entity クラスの1インスタンスはデータベーステーブルの1行のデータと対応する。
Jakarta Persistence での Entity クラスの指定は、 基本的にはJava クラスの定義に jakarta.persistence パッケージの Entity アノテーションを付加することで行われる。

このアプリケーションでは、Contact クラスが Entity クラスとして指定されている。
デフォルトではクラス名がマップ先のテーブル名として使われるので、CONTACT という名前のテーブルが使われることになる。
ソースコードレベルの詳細は次回以降の記事で説明する。

Entity マネージャインスタンスの作成

Entity クラスのインスタンスを作って各フィールドの値を更新しても、それだけではデータベースとの同期は行われない。

データベースとの同期を行うためには Entity マネージャインスタンスの必要なメソッドを、 Entity クラスのオブジェクトを引数として実行する必要がある。

例えば Create 画面で入力フォームによりデータを送信したときには Contact クラスオブジェクトのメンバ変数の値が更新されるとともに、そのオブジェクトを引数として Entityマネージャの persist()メソッドが実行されることでデータベーステーブルにそのContact オブジェクトに対応する新しい行データが挿入される。

インスタンス作成の具体的な方法等も含めて、詳細は次回以降の記事で説明する。

Persistence Unit の設定

Entity クラスは Entity マネージャによって管理される。Entity マネージャインスタンスをつくるときはそのマネージャが属する Persistence Unit の名前を指定する必要がある。
Persistence Unit は persistence.xml ファイルで定義、設定される。
このファイルは WAR アーカイブファイルの場合は WEB-INF/classes/META-INF ディレクトリに配置する。
Jakarta EE 10 では xmlスキーマファイルのバージョン 3.1 が対応する。

address-book アプリケーションでの設定内容を確認する。
  <persistence-unit name="address-bookPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:comp/DefaultDataSource</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property
        name="jakarta.persistence.schema-generation.database.action"
        value="drop-and-create"/>
    </properties>
  </persistence-unit>

persistence-unit エレメントの name 属性では Persistence Unit の名前を指定する。この名前は Entity Manager の作成時に指定する。

transaction-type 属性はEntity Manager のトランザクションタイプを指定する。
Jakarta Transactions を使用する場合は "JTA" とする。この値は Jakarta EE 環境でのデフォルト値になっている。
EntityTransaction API を使用する場合は "RESOURCE_LOCAL" とする。これはJava SE の環境でデフォルトで使用される。

"JTA"を指定した場合はトランザクションがコンテナによって自動的に管理される。
Jakarta EE のアプリケーションでも "RESOURCE_LOCAL" を指定して使うことはできる。この場合はトランザクションの管理をアプリケーションのJava コードで記述して行うことになる。

<provider> エレメントでは Persistence プロバイダの指定を行う。具体的には jakarta.persistence.spi.PersistenceProvider インターフェースを実装するクラス名を指定する。
Eclipse GlassFish 7 ではデフォルトでプロバイダとして EclipseLink が使われる。
org.eclipse.persistence.jpa.PersistenceProvider クラスはGlassFish のインストールディレクトリに含まれている。

デフォルト以外のプロバイダを使用する場合は対応する JAR ファイルをダウンロードして使用する必要がある。例えば Hibernate の場合は下記のクラス名を指定する。
org.hibernate.jpa.HibernatePersistenceProvider

<jta-data-source>エレメントではデータソース名を指定する。
java:comp/DefaultDataSource というデータソースは GlassFish サーバーにデフォルトで設定されている。

<exclude-unlisted-classes> エレメントは Persistence Unit で管理するクラスの指定方法に関わり、 false の場合は Entity クラスを指定するのに Entity アノテーションが使用されることを意味する。
true の場合は <class> エレメントで指定したクラスが Persistence Unit に含められるクラスとなる。

property エレメントでは以下のようにデータベーススキーマ生成の方法を設定している。
<property name="jakarta.persistence.schema-generation.database.action"
                value="drop-and-create"/>

value属性の可能な値は下記の通り:
・none
・drop-and-create
・create
・drop
デフォルトでは none となりスキーマ生成が行われない。
ここでは drop-and-create に設定しているので、アプリケーションのデプロイの度にデータベースのテーブルが削除/作成される。

PostgreSQL を使う設定

以前に述べたように、GlassFish サーバーを使用している場合はデフォルトでは Apache Derby がデータベースとして使われる。
ここでは例として PostgreSQL を使用するための設定について説明する。

必要な手順は下記の通り:
・PostgreSQL のインストール
・JDBC ドライバーのダウンロード
・JDBC リソースと JDBC コネクションプールの設定
・persistence.xml の編集

PostgreSQL のインストール
システムに PostgreSQL をインストールする。
使用するデータベースと、データベースのユーザーを作成しておく。
アプリケーションのデプロイ時にはデータベースサーバーが起動している必要がある。

JDBC ドライバーのダウンロード
使用する PostgreSQL のバージョンに対応した JDBC ドライバーを下記からダウンロードする。
URL:  jdbc.postgresql.org/download/
GlassFish サーバーのドメインディレクトリ(デフォルトでは domain1) の lib ディレクトリに JAR ファイルを置く。

JDBC リソースと JDBC コネクションプールの設定
GlassFish サーバーの管理画面で JDBC リソースとJDBC コネクションプールの設定を行う。
JNDI Name は任意に設定。Pool Name は使用する コネクションプールの名前を設定。
resource.png

Pool Name を任意に設定。
Datasource Classname: は org.postgresql.ds.PGSimpleDataSource に設定。
pool1.png

Additional Properties タブで、作成済みのデータベースへの接続情報を設定する。
pool2.png

persistence.xml の編集
<jta-data-source> エレメントでJDBC リソースの名前を指定する。
<jta-data-source>jdbc/PostgresData</jta-data-source>

<property> エレメントで下記のように PostgreSQL の使用を設定する。(なくても自動で判別されるかも知れない)
<property name="eclipselink.target-database" value="PostgreSQL"/> 


参考資料:
"Jakarta Persistence 3.1" の仕様書
"Eclipse GlassFish Application Development Guide, Release 7"

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

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