1.はじめに


  • Ebean

    はJavaで書かれたオブジェクトリレーショナルマッピングツールです。**

エンティティを宣言するための標準JPAアノテーションをサポートしています。

ただし、永続化するためのはるかに単純なAPIが提供されています。実際、Ebeanのアーキテクチャーについて言及する価値があるのは、それがセッションレスであるということです。つまり、エンティティーを完全に管理しているわけではありません。

それ以外にも、クエリAPIが付属しており、ネイティブSQLでのクエリの作成をサポートしています。 Ebeanは、Oracle、Postgres、MySql、H2など、すべての主要データベースプロバイダをサポートしています。

このチュートリアルでは、EbeanとH2を使用してエンティティを作成、保持、およびクエリする方法について説明します。

2.セットアップ

まず始めに、依存関係と基本的な設定を取得しましょう。

2.1. Mavenの依存関係

始める前に、必要な依存関係をインポートしましょう。

<dependency>
    <groupId>io.ebean</groupId>
    <artifactId>ebean</artifactId>
    <version>11.22.4</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.196</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>


Ebean

、https://search.maven.org/search?q=gの最新バージョン:com.h2database%20AND%20a:h2&core = gav[H2]、およびhttps://search.maven.org/search?q=g:ch.qos.logback%20AND%20a:logback-classic&core=gav[Logback]はMaven Centralで見つけることができます。

2.2. 機能強化

Ebeanは、エンティティBeanをサーバーで管理できるように修正する必要があります。そこで、その仕事をするためにMavenプラグインを追加します。

<plugin>
    <groupId>io.ebean</groupId>
    <artifactId>ebean-maven-plugin</artifactId>
    <version>11.11.2</version>
    <executions>
        <execution>
            <id>main</id>
            <phase>process-classes</phase>
            <configuration>
                <transformArgs>debug=1</transformArgs>
            </configuration>
            <goals>
                <goal>enhance</goal>
            </goals>
        </execution>
    </executions>
</plugin>

トランザクションを使用するエンティティとクラスを含むパッケージの名前をMavenプラグインに提供する必要もあります。それを行うために、__ebean.mfファイルを作成します。

entity-packages: com.baeldung.ebean.model
transactional-packages: com.baeldung.ebean.app

2.3. ロギング

また、

logback.xml

を作成し、一部のパッケージのログレベルを

TRACE

に設定して、実行中のステートメントを確認しましょう。

<logger name="io.ebean.DDL" level="TRACE"/>
<logger name="io.ebean.SQL" level="TRACE"/>
<logger name="io.ebean.TXN" level="TRACE"/>

3.サーバの設定

エンティティを保存したりデータベースでクエリを実行するために

EbeanServer

インスタンスを作成する必要があります。サーバーインスタンスを作成する方法は2つあります。デフォルトのプロパティファイルを使用する方法とプログラムで作成する方法です。

3.1. デフォルトのプロパティファイルを使用する

デフォルトのプロパティファイルは

properties

または

yaml

型にすることができます。 Ebeanは

application.properties



ebean.properties

、または

application.yml

という名前のファイルで設定を検索します。

データベース接続の詳細を提供する以外に、EbeanにDDLステートメントを作成して実行するように指示することもできます。

それでは、設定例を見てみましょう。

ebean.db.ddl.generate=true
ebean.db.ddl.run=true

datasource.db.username=sa
datasource.db.password=
datasource.db.databaseUrl=jdbc:h2:mem:customer
datasource.db.databaseDriver=org.h2.Driver

3.2. ServerConfigを使う

次に、

EbeanServerFactory



ServerConfig

を使用してプログラムで同じサーバーを作成する方法を見てみましょう。

ServerConfig cfg = new ServerConfig();

Properties properties = new Properties();
properties.put("ebean.db.ddl.generate", "true");
properties.put("ebean.db.ddl.run", "true");
properties.put("datasource.db.username", "sa");
properties.put("datasource.db.password", "");
properties.put("datasource.db.databaseUrl","jdbc:h2:mem:app2";
properties.put("datasource.db.databaseDriver", "org.h2.Driver");

cfg.loadFromProperties(properties);
EbeanServer server = EbeanServerFactory.create(cfg);

3.3. デフォルトのサーバーインスタンス

  • 1つの

    EbeanServer

    インスタンスが1つのデータベースにマッピングされています。

単一のサーバーインスタンスのみが作成された場合、デフォルトでは、それがデフォルトサーバーインスタンスとして登録されます。

Ebean

クラスの静的メソッドを使用して、アプリケーション内のどこにでもアクセスできます。

EbeanServer server = Ebean.getDefaultServer();

複数のデータベースがある場合は、サーバーインスタンスの1つをデフォルトのインスタンスとして登録することができます。

cfg.setDefaultServer(true);

4.エンティティの作成

EbeanはJPAアノテーションとそれ自身のアノテーションを使った追加機能を完全にサポートしています。

JPAとEbeanの両方のアノテーションを使用してエンティティをいくつか作成しましょう。まず、エンティティ全体で共通のプロパティを含む

BaseModel

を作成します。

__

@MappedSuperclass
public abstract class BaseModel {

    @Id
    protected long id;

    @Version
    protected long version;

    @WhenCreated
    protected Instant createdOn;

    @WhenModified
    protected Instant modifiedOn;

   //getters and setters
}

ここでは、

MappedSuperClass

JPAアノテーションを使用して

BaseModel.

を定義し、2つのEbeanアノテーション

io.ebean.annotation.WhenCreated

および

io.ebean.annotation.WhenModified

を監査目的で定義しました。

次に、

BaseModel

を拡張する2つのエンティティ

Customer



Address

を作成します。

@Entity
public class Customer extends BaseModel {

    public Customer(String name, Address address) {
        super();
        this.name = name;
        this.address = address;
    }

    private String name;

    @OneToOne(cascade = CascadeType.ALL)
    Address address;

   //getters and setters
}

@Entity
public class Address extends BaseModel{

    public Address(String addressLine1, String addressLine2, String city) {
        super();
        this.addressLine1 = addressLine1;
        this.addressLine2 = addressLine2;
        this.city = city;
    }

    private String addressLine1;
    private String addressLine2;
    private String city;

   //getters and setters
}


Customer

では、

Address

を使用して1対1マッピングを定義し、子エンティティも親エンティティとともに更新されるようにset cascade typeを

ALL

に追加しました。

5.基本的なCRUD操作

以前、

EbeanServer

の設定方法を見て、2つのエンティティを作成しました。それでは、

基本的なCRUD操作を

実行しましょう。

データの永続化とアクセスには、デフォルトのサーバーインスタンスを使用します。

Ebean

クラスは、リクエストをデフォルトのサーバーインスタンスにプロキシするデータを永続化してアクセスするための静的メソッドも提供します。

Address a1 = new Address("5, Wide Street", null, "New York");
Customer c1 = new Customer("John Wide", a1);

EbeanServer server = Ebean.getDefaultServer();
server.save(c1);

c1.setName("Jane Wide");
c1.setAddress(null);
server.save(c1);

Customer foundC1 = Ebean.find(Customer.class, c1.getId());

Ebean.delete(foundC1);

まず、

Customer

オブジェクトを作成し、

save()

を使用してそれを保存するためにデフォルトのサーバーインスタンスを使用しました。

次に、顧客の詳細を更新し、

save()

を使用してもう一度保存します。

最後に、

Ebean

の静的メソッド

find()

を使用して顧客を取得し、

delete()

を使用して削除します。

6.問い合わせ

  • クエリAPIを使用して、フィルタと述語を含むオブジェクトグラフを作成することもできます** クエリの作成と実行には、

    Ebean

    または

    EbeanServer

    を使用できます。

都市別に

Customer

を検索し、入力された一部のフィールドのみを含む

Customer



__Address

__オブジェクトを返すクエリを見てみましょう。

Customer customer = Ebean.find(Customer.class)
            .select("name")
            .fetch("address", "city")
            .where()
            .eq("city", "San Jose")
            .findOne();

ここでは、

find()

を使用して、

Customer

型のエンティティを検索することを示します。次に、

select()

を使用して、

Customer

オブジェクトに移入するプロパティを指定します。

その後、

Customer

に属する

Address

オブジェクトを取得し、

city

フィールドを取得したいことを示すために

fetch()

を使用します。

最後に、述語を追加し、結果のサイズを1に制限します。

7.トランザクション

Ebeanはデフォルトで新しいトランザクションで各ステートメントまたはクエリを実行します。

場合によってはこれは問題にならないかもしれませんが。単一のトランザクション内で一連のステートメントを実行したい場合があります。

そのような場合、メソッドに____io.ebean.annotations.Transactionalという注釈を付けると、メソッド内のステートメントはすべて同じトランザクション内で実行されます。

@Transactional
public static void insertAndDeleteInsideTransaction() {
    Customer c1 = getCustomer();
    EbeanServer server = Ebean.getDefaultServer();
    server.save(c1);
    Customer foundC1 = server.find(Customer.class, c1.getId());
    server.delete(foundC1);
}

8.プロジェクトの構築

最後に、次のコマンドを使ってMavenプロジェクトをビルドできます。

compile io.ebean:ebean-maven-plugin:enhance

9.まとめ

まとめると、リレーショナルデータベース内のエンティティを永続化したりクエリしたりするために使用できるEbeanの基本機能を見てきました。

最後に、このコードはhttps://github.com/eugenp/tutorials/tree/master/libraries-data[Github]から入手できます。