JPAを使用する準備

JPAはデータベースアクセスの基礎となる技術です。ここではJPAを説明し、使用するプロジェクトを準備します。

JPAとは?

JPA(Java Persistence API)は、リレーショナルデータベースへアクセスするフレームワークです。Java SEでは長い間JDBCが一般的でした。

正確には、JPAはデータの永続化を提供します。つまり、プログラム終了後もデータが残ります。JPAを使用すると、操作ごとにSQLを記述したり、フィールドを個別に取り出して変換したりせず、Javaオブジェクトを保存して取得できます。

内部ではJPAがデータベースへアクセスします。アプリケーション側ではJavaオブジェクトを保存して取得します。ORM(Object-relational Mapping)はJavaオブジェクトとリレーショナルデータベースのレコードを対応付けます。JPAも同様にオブジェクト指向で永続化を扱えます。

JPAにはSQLに似たJPQLもあります。データベースが変わっても一貫した形式でクエリを記述できるため、通常はアプリケーションコードではなく設定を変更します。

JPAプロジェクトを作成する

Apache MavenでWebアプリケーションプロジェクトを作成します。

$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp

次の値を入力します。

groupId: com.devkuma.jpa
artifactId: JavaApp
version: 1.0-SNAPSHOT
package: com.devkuma.jpa

フォルダー構成

.
├── pom.xml
└── src
    └── main
        ├── resources
        └── webapp
            ├── WEB-INF
            │   └── web.xml
            └── index.jsp

webappフォルダーにはWebアプリケーションとして公開するファイルを配置します。resourcesフォルダーにはJPAで必要な設定ファイルを配置します。

pom.xmlを作成する

pom.xmlへMavenのビルド設定と必要なライブラリを記述します。

Webアプリケーション用ライブラリ

サーブレットコンテナとしてJettyを使用します。

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>${jetty.version}</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>${jetty.version}</version>
</dependency>

Webアプリケーション用プラグイン

Webアプリケーションを実行するため、Jetty Maven pluginを追加します。

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>${jetty.version}</version>
</plugin>

完成したpom.xml

完成したプロジェクトでは、Jetty、H2、Eclipse Persistence JPA、Jetty Maven pluginを使用します。

<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.devkuma.jpa</groupId>
    <artifactId>JavaApp</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jetty.version>9.4.7.v20170914</jetty.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-webapp</artifactId>
            <version>${jetty.version}</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.196</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa</artifactId>
            <version>2.7.0</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>JavaApp</finalName>
        <plugins>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>${jetty.version}</version>
            </plugin>
        </plugins>
    </build>
</project>