Maven 入門 | データベースの利用 | JPA を使用するプログラム

JPA を使用するプログラムを作成する方法を説明する。

persistence.xml の準備

JPA を使用する場合は、persistence.xml というファイルを用意する必要がある。これは JPA で使用する永続化ユニットを定義するためのものである。

main フォルダの下に resources フォルダを作成する。これは前述のとおり、リソースフォルダとして登録するものである。このフォルダに “META-INF” というフォルダを作り、その中に “persistence.xml” という名前のファイルを用意する。

以下に persistence.xml のソースコードを示す。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
        http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
 
    <persistence-unit name="sample-persistance" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.devkuma.MyEntity</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:db" />
            <property name="javax.persistence.jdbc.user" value="sa" />
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
            <property name="eclipselink.ddl-generation.output-mode" value="database" />
        </properties>
    </persistence-unit>
</persistence>

persistence.xml では、<persistence> タグの中に <persistence-unit> タグを用意し、そこに永続化ユニットの情報を記述する。ここでは次の情報がまとめられている。

  • ユニット名: sample-persistance
  • プロバイダ: org.eclipse.persistence.jpa.PersistenceProvider
  • エンティティクラス: com.devkuma.MyEntity
  • プロパティ:
    • javax.persistence.jdbc.driver (ドライバクラス): org.h2.Driver
    • javax.persistence.jdbc.url (データベース URL): jdbc:h2:mem:db
    • javax.persistence.jdbc.user (ユーザー名): sa
    • eclipselink.ddl-generation (EclipseLink 設定): drop-and-create-tables
    • eclipselink.ddl-generation.output-mode (EclipseLink 設定): database

最後の 2 つの EclipseLink 設定を除けば、これらは JPA を使用するときにほとんどの場合必要になる情報である。特に最初のユニット名、プロバイダクラス、エンティティクラスの 3 つは必須項目として必ず用意する。

<properties> タグ内の値は、使用するデータベースによって変わる。ドライバ、URL、ユーザー名は、多くのデータベースで必要になる。H2 以外のデータベース設定についてはここでは扱わないため、必要に応じて別途学習してほしい。

エンティティクラスの作成

persistence.xml が用意できたら、次に必要なのは「エンティティクラス」である。エンティティクラスは、JPA でデータベースにアクセスするときの基本となる。JPA では、データベーステーブルの内容をエンティティクラスとして定義し、レコードをやり取りするときはこのエンティティクラスのインスタンスとして扱う。

先ほど persistence.xml で、クラスとして com.devkuma.MyEntity を設定した。これが sample-persistance 永続化ユニットで使用するエンティティクラスである。このクラスを作成してみよう。

src/main/java/com/devkuma/ フォルダの中に “MyEntity.java” という名前でファイルを作成し、次のようにソースコードを書く。

package com.devkuma;
 
import java.util.Date;
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
 
@Entity
public class MyEntity {
    @Id
    @GeneratedValue
    private Integer id;
 
    private String name;
    private String message;
    private Date date = Calendar.getInstance().getTime();
 
    public MyEntity(){
        super();
    }
 
    public MyEntity(String name, String msg){
        super();
        this.name = name;
        this.message = msg;
    }
 
    public Integer getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String msg) {
        this.message = msg;
    }
    public Date getDate() {
        return date;
    }
 
    @Override
    public String toString() {
        return "{\n\tid: " + id + ",\n\tname: " + name + ",\n\tmessage: "
             + message+ ",\n\tdate: " + date + "\n}";
    }
 
}

エンティティクラスは、@Entity アノテーションを付けた POJO クラスである。主キーになるフィールドには @Id を付け、さらに @GeneratedValue によって値が自動採番されることを示す。

その後は、private フィールドとその setter/getter メソッドの形で保存する値を用意している。これらはテーブルに含まれる項目に対応する。今回は id、name、message、date などの項目を用意した。

MyEntity を利用する

これで H2 + JPA でデータベースを利用する環境が整った。実際に使ってみよう。

以下に簡単なサンプルを示す。App.java を編集する。

package com.devkuma;
 
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
 
public class App {
    private static EntityManagerFactory factory
        = Persistence.createEntityManagerFactory("sample-persistance");
 
    public static void main( String[] args ){
        EntityManager manager = factory.createEntityManager();
        try {
            manager.getTransaction().begin();
            manager.persist(new MyEntity("sungjin", "This is sample message!"));
            manager.persist(new MyEntity("wonsuk", "안녕하세요!"));
            manager.persist(new MyEntity("byeongho", "이것을 테스트입니다."));
            manager.getTransaction().commit();
 
            Query query = manager.createQuery("select i from MyEntity i");
            List<MyEntity> list = query.getResultList();
            int count = 0;
            for (MyEntity p : list) {
                System.out.print("No," + ++count + " ");
                System.out.println(p);
            }
            System.out.println(" -- total: " + list.size() + " data.");
        } finally {
            manager.close();
        }
    }
}

ソースを変更したら、次のように実行してパッケージ化とプログラムの実行を行う。

mvn package
mvn exec:java

実行すると、コンソールに次のようなテキストが出力される。

No, 1 {
        id : 1
        name : sungjin,
        message : This is sample message !,
        date : Fri Oct 13 21:28:11 JST 2017
}
No, 2 {
        id : 2
        name : wonsuk,
        message : 안녕하세요!,
        date : Fri Oct 13 21:28:11 JST 2017
}
No, 3 {
        id : 3
        name : byeongho,
        message : 이것을 테스트입니다. ,
        date : Fri Oct 13 21:28:11 JST 2017
}
 - total : 3 data.

ここではダミーとして 3 つのエンティティを作成してデータベースに保存し、再びデータベースから MyEntity を取得して内容を出力している。まずはデータの読み書きができることを確認できる。

ここでは JPA の使い方を詳しく説明することが目的ではないため、詳細な説明は省略する。これで「JPA を使用するプログラム」の基本的な作り方は理解できただろう。まずはデータベースから始め、少しずつ利用できるライブラリの幅を広げていけばよい。