Quarkus で JPA を使ったアプリケーション作成

f:id:Naotsugu:20191009214703p:plain




はじめに

以下では Quarkus による JAX-RS を使った簡単なアプリケーションを作成しました。

blog1.mammb.com


ここでは JPA を使い、データベースを利用したアプリケーションを作成していきます。



プロジェクトの作成

前回と同様に、Gradle でプロジェクトを作成します。 Gradle は 5系を想定します。

$ mkdir example-quarkus-jpa
$ cd example-quarkus-jpa
$ gradle init --type java-application
$ rm src/main/java/example/quarkus/jpa/App.java
$ rm src/test/java/example/quarkus/jpa/AppTest.java


Gradle 5 系の場合は gradle init タスクでいくつか選択肢の入力が求められますが、全てデフォルトで良いです。


build.gradle を以下のように編集します。

plugins {
    id 'java'
    id 'io.quarkus' version '0.23.2'
}

repositories {
    jcenter()
}

dependencies {
    implementation enforcedPlatform('io.quarkus:quarkus-bom:0.23.2')
    implementation 'io.quarkus:quarkus-resteasy-jsonb'
    implementation 'io.quarkus:quarkus-hibernate-orm'
    implementation 'io.quarkus:quarkus-jdbc-postgresql'
}

quarkus-hibernate-ormquarkus-jdbc-postgresql を追加しています。

レスポンスにモデルを JSON で返したいので quarkus-resteasy-jsonb を使います。


前回と同様に settings.gradle を以下のように定義します(quarkus プラグインが正式公開されれば不要となります)。

pluginManagement {
    repositories {
        mavenCentral()
        gradlePluginPortal()
    }
    resolutionStrategy {
        eachPlugin {
            if (requested.id.id == 'io.quarkus') {
                useModule("io.quarkus:quarkus-gradle-plugin:${requested.version}")
            }
        }
    }
}

rootProject.name = 'example-quarkus-jpa'


application.properties に DB接続情報を定義しておきます。

$ touch src/main/resources/application.properties


以下のように編集します。

quarkus.datasource.url = jdbc:postgresql://localhost:5432/quarkus_db
quarkus.datasource.driver = org.postgresql.Driver
quarkus.datasource.username = quarkus
quarkus.datasource.password = quarkus

quarkus.hibernate-orm.database.generation=drop-and-create



Entity の作成

Entity を作成します。

$ touch src/main/java/example/quarkus/jpa/Gift.java


package example.quarkus.jpa;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Gift {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="giftSeq")
    private Long id;

    private String name;


    protected Gift() { }

    public Gift(String name) {
        this.name = name;
    }

    public Long getId() { return id; }

    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }
}



サービスの作成

サービスクラスを作成します。

$ touch src/main/java/example/quarkus/jpa/GiftService.java


面倒なので直接 EntityManager を使っちゃいます。

package example.quarkus.jpa;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;

@ApplicationScoped
public class GiftService {

    @Inject
    EntityManager em;

    @Transactional
    public Long createGift(String name) {
        Gift gift = new Gift(name);
        em.persist(gift);
        return gift.getId();
    }

    public Gift getGift(Long id) {
        return em.find(Gift.class, id);
    }
}



リソースの作成

最後にリソースです。

$ touch src/main/java/example/quarkus/jpa/GiftService.java


こちらは前回作成したものとだいたい同じです。

package example.quarkus.jpa;

import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/gifts")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class GiftResource {

    @Inject
    GiftService service;

    @POST
    @Path("/")
    public Long create(Gift gift) {
        return service.createGift(gift.getName());
    }

    @GET
    @Path("/{id}")
    public Gift get(@PathParam("id") Long id) {
        return service.getGift(id);
    }
}



データベースの起動

application.properties で定義した quarkus_db と、ユーザ quarkus を準備します。

docker の場合は以下のようにします。

docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 \
           --name postgres-quarkus-hibernate -e POSTGRES_USER=quarkus \
           -e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=quarkus_db \
           -p 5432:5432 postgres:10.5



アプリケーションの起動

アプリケーションを開発モードで起動します。

$ ./gradlew quarkusDev

http://localhost:8080/ にアクセスすると、リソースの一覧が見えます。

f:id:Naotsugu:20191018200413p:plain


いくつかレコードを追加してみましょう。

$ curl -X POST -H 'Content-Type: application/json' 'http://localhost:8080/gifts' -d '{"name": "book"}'
1
$ curl -X POST -H 'Content-Type: application/json' 'http://localhost:8080/gifts' -d '{"name": "flower"}'
2
$ curl -X GET -H 'Accept: application/json' 'http://localhost:8080/gifts/1'
{"id":1,"name":"book"}

取得できました。

ブラウザでも見てみましょう。

f:id:Naotsugu:20191018200850p:plain



登録レコードの確認

psql でデータベースに接続します。

docker exec -it postgres-quarkus-hibernate psql -U quarkus -d quarkus_db


テーブルを見てみます。

quarkus_db=# \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+---------
 public | gift | table | quarkus
(1 row)


レコードを見てみます。

quarkus_db=# select * from gift;
 id |  name
----+--------
  1 | book
  2 | flower
(2 rows)

登録されていますね。



まとめ

JPA を使ったアプリケーションを Quarkus を使って作成しました。

JavaEE の API でアプリケーションが簡単に作成できました。


Quarkus はまだ 1.0 に達していませんが、少しずつ見ていきたいですね。


次回は Panache の利用方法について見ていきます。

blog1.mammb.com