Ebean ORMのガイド
1. 前書き
Ebeanは、Javaで記述されたオブジェクトリレーショナルマッピングツールです。
エンティティを宣言するための標準JPA注釈をサポートしています。 ただし、永続化のためのはるかに単純なAPIを提供します。 実際、Ebeanアーキテクチャについて言及する価値のあるポイントの1つは、セッションがないことです。つまり、エンティティを完全に管理するわけではありません。
それに加えて、クエリAPIも付属し、ネイティブSQLでのクエリの記述をサポートします。 Ebeanは、Oracle、Postgres、MySql、H2などの主要なデータベースプロバイダーをすべてサポートしています。
このチュートリアルでは、EbeanとH2を使用してエンティティを作成、永続化、クエリする方法を見ていきます。
2. セットアップ
開始するには、依存関係といくつかの基本的な構成を取得しましょう。
2.1. Mavenの依存関係
始める前に、必要な依存関係をインポートしましょう。
io.ebean
ebean
11.22.4
com.h2database
h2
1.4.196
ch.qos.logback
logback-classic
1.2.3
2.2. 機能強化
Ebeanは、エンティティBeanを変更して、サーバーで管理できるようにする必要があります。 したがって、その仕事をするためにMavenプラグインを追加します。
io.ebean
ebean-maven-plugin
11.11.2
main
process-classes
debug=1
enhance
また、トランザクションを使用するエンティティとクラスを含むパッケージの名前をMavenプラグインに提供する必要があります。 これを行うには、ファイルebean.mf:を作成します
entity-packages: com.example.ebean.model
transactional-packages: com.example.ebean.app
2.3. ロギング
また、logback.xmlを作成し、一部のパッケージのログレベルをTRACEに設定して、実行中のステートメントを確認できるようにします。
3. サーバーの構成
エンティティを保存したり、データベースでクエリを実行したりするには、EbeanServerインスタンスを作成する必要があります。 サーバーインスタンスを作成するには、デフォルトのプロパティファイルを使用する方法と、プログラムで作成する方法の2つの方法があります。
3.1. デフォルトプロパティファイルの使用
デフォルトのプロパティファイルのタイプは、propertiesまたはyamlです。 Ebeanは、application.properties、ebean.properties、またはapplication.ymlという名前のファイルで構成を検索します。
データベース接続の詳細を提供するだけでなく、EDLに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. デフォルトのサーバーインスタンス
A single EbeanServer instance maps to a single database.要件に応じて、複数の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
}
ここでは、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カスケードタイプをALLに追加して、子エンティティも親エンティティとともに更新されるようにしました。
5. 基本的なCRUD操作
以前、EbeanServerを構成する方法を確認し、2つのエンティティを作成しました。 今、それらのlet’s carry out some basic CRUD operations。
デフォルトのサーバーインスタンスを使用して、データを永続化し、アクセスします。 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. 問い合わせ
Query APIs can also be used to create an object graph with filters and predicates.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は、デフォルトで新しいトランザクションで各ステートメントまたはクエリを実行します。
ただし、これは問題にならない場合があります。 単一のトランザクション内で一連のステートメントを実行したい場合があります。
このような場合、メソッドにio.ebean.annotations.Transactional, allアノテーションを付けると、メソッド内のすべてのステートメントが同じトランザクション内で実行されます。
@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で利用できます。