1. 序章

Ebean は、Javaで記述されたオブジェクトリレーショナルマッピングツールです。

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

さらに、クエリ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.6</version>
</dependency>

Ebean H2 、およびLogbackの最新バージョンはMavenCentralにあります。

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という名前のファイルで構成を検索します。

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

それでは、サンプル構成を見てみましょう。

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の使用

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

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. デフォルトのサーバーインスタンス

単一のEbeanServerインスタンスが単一のデータベースにマップされます。要件によっては、複数のEbeanServerインスタンスを作成することもできます。

単一のサーバーインスタンスのみが作成される場合、デフォルトでは、それはデフォルトのサーバーインスタンスとして登録されます。 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
}

ここでは、 MappedSuperClassJPAアノテーションを使用してBaseModel。と2つのEbeanアノテーションio.ebean.annotation.WhenCreatedio.ebeanを定義しました。監査目的の.annotation.WhenModified

次に、BaseModelを拡張する2つのエンティティCustomerAddressを作成します。

@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のマッピングを定義し、setcascadeタイプを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オブジェクトに入力するプロパティを指定します。

後で、 fetch()を使用して、Customerに属するAddressオブジェクトをフェッチし、cityをフェッチすることを示します。 フィールド

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

7. トランザクション

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

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

このような場合、メソッドに 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の基本機能について見てきました。

最後に、このコードはGithubで入手できます。