Object Computing, Inc.(OCI) は、 Micronaut Data 1.0プロジェクトのマイルストーン・リリースを特徴とするMicronaut 1.3を リリースした。"これは、薄くて軽量なランタイム・レイヤーで実行するリポジトリ・インターフェースのためのクエリを事前に演算するためAhead of Time (AoT) コンパイラを使用するデータベース・アクセス・ツールキットだ。" Micronaut 1.3のその他の機能には、不変の設定プロパティ、Ehache、Hazelcast、Infinispanなどのキャッシュサポート、Kotlinコ・ルーチンと非同期フローの初期サポート、GraalVM 19.3とJackson XMLによるXMLシリアライゼーション/デシリアライゼーションのサポート、パフォーマンスとメモリ消費の改善が含まれている。
元はMicronaut Predatorとして知られていたMicronaut Dataは、 クエリ
モデルをコンパイル時にクエリに変換するための一般的なAPIを提供する。また、JPA/Hibernate と SQL/JDBC バックエンドのランタイムサポートを提供する。Micronaut Dataチームは、将来的に他のデータベース実装をサポートする予定だ。Micronaut Dataは、H2、MySQL 5.5+、Oracle 12c+、PostgreSQL 9.5+、SQLServer 2012+をサポートしている。
GORMとSpring Dataに鼓舞されたMicronaut Dataは、リフレクションを使用するランタイムモデルを排除し、正規表現とパターンマッチングを使用するクエリ変換を排除し、型の安全性を追加することで、これら2つの技術を改善する。GORMやSpring Dataで、エンティティ間の関係をモデリングするためにリフレクションを使用すると、より多くのメモリを消費する。
はじめに
他のMicronautアプリケーションと同様に、動作するMicronautデータ・アプリケーションはより包括的なアプリケーションの出発点として、JPA/HibernateまたはSQL/JDBCバックエンドのいずれかの適切なパラメータを使用してコマンドライン経由で作成できる。
$ mn create-app myapp --features data-hibernate-jpa
$ mn create-app myapp --features data-jdbc
Gradle を Micronaut アプリケーションのデフォルトのビルドツールとして設定した場合、生成された build.gradle
ファイルには、適切な依存関係が含まれる。
implementation "io.micronaut.data:micronaut-data-hibernate-jpa"
implementation "io.micronaut.data:micronaut-data-jdbc"
Micronaut Dataで簡単な映画のH2データベースアプリケーションのモデルを考えてみる。テーブルが2つ、movie
そして director
は、アプリケーション内に対応する POJO、リポジトリ、コントローラを持っています。Movie
クラスは、 それを表すmovie
テーブルにいくつかの映画の情報を記録し、汎用固有識別コード (UUID
)と director
テーブルと@ManyToOne
関係を持つ。
@Entity
public class Movie {
@Id
@AutoPopulated
private UUID id;
private String name;
private MovieType type;
private int year;
@ManyToOne
private Director director;
@Creator
public Movie(String name, @Nullable Director director, MovieType type, int year) {
// setter methods
}
}
Micronaut Dataによって自動設定される@AutoPopulated
はアノテーションを識別し、@Creator
はプライマリ コンストラクタに適用されるアノテーションだ。
リポジトリの作成
次のようなリポジトリインターフェイスを考えてみる。
@JdbcRepository(dialect = Dialect.H2)
public interface MovieRepository extends CrudRepository<Movie,Long> {
Movie findByName(String name);
@Join("director")
Optional<Movie> findByName(String lastName);
}
MovieRepository
インターフェイスは @JdbcRepository
アノテーションを経由するデータリポジトリとして定義される。それは、生のSQLエンコーディングを使用するRepository
を構成するステレオタイプリポジトリのアノテーションだ。 実装は、実行時にMicronaut Dataによって自動的に生成される。CrudRepository
インターフェイスは、作成、読み込み、更新、削除の操作を自動的に提供する。movie
テーブルは@Join
アノテーションを介してdirector
テーブルと結合される。
クエリ演算
アプリケーションのPOJO、リポジトリ、およびコントローラに基づいて、Micronaut Dataは適切なクエリを演算する。次のテストを考えてみる。
@Inject
BeanContext beanContext;
@Test
void testQuery() {
String query = beanContext.getBeanDefinition(MovieRepository.class)
.getRequiredMethod("findByName",String.class)
.getAnnotationMetadata()
.stringValue(Query.class)
.get();
assertEquals(
"SELECT ...FROM ...INNER JOIN ...ON ...WHERE ...",
query
);
}
注入されたMicronaut BeanContext
はMovieRepository
インターフェイスで定義されたfindByName()
メソッドに基づいて完全なクエリを生成するだろう。
SELECT movie_.`id`,movie_.`name`,movie_.`director_id`,movie_.`type`,movie_.`year`,movie_director_.`last_name` AS
director_last_name,movie_director_.`first_name` AS director_first_name,movie_director_.`name` AS director_name FROM
`movie` movie_ INNER JOIN `director` movie_director_ ON movie_.`director_id`=movie_director_.`id` WHERE (movie_.`name` = ?)
完全な包括的な例はGitHubにある。
Micronaut 2.0への道
Micronaut 2.0に向けて、Micronautチームは以下のような改善を計画している。
- SQL、Neo4j、MongoDB用のReactive Micronaut Data
- HTTP/2 サポート
- サーバーレス対応の改善
- MavenとGradleのための新しいビルドプラグイン
- さらなる性能向上
Micronaut Dataは、Micronaut AWS、Micronaut GCP、Micronaut for Spring、Micronaut RabbitMQ、Micronaut Testなどの他のMicronautプロジェクトに参加している。
編集部注
最近のマイナーなMicronaut 1.3.3のリリースでは、GraalVM 20.0.0をサポートしている。