Apache Cayenne ORMの紹介

1概要

Apache Cayenne は、Apacheライセンスの下で配布されているオープンソースライブラリで、モデリングツール、ローカルパーシスタンス操作用のオブジェクトリレーショナルマッピング、別名ORM、リモートサービスなどの機能を提供します。

次のセクションでは、Apache Cayenne ORMを使ってMySQLデータベースとやり取りする方法を説明します。

2 Mavenの依存関係

まずはじめに、Apache CayenneとMySQLがJDBCドライバーを接続して intro cayenne__データベースにアクセスするために、以下の依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.cayenne</groupId>
    <artifactId>cayenne-server</artifactId>
    <version>4.0.M5</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.44</version>
    <scope>runtime</scope>
</dependency>

データベーススキーマとJavaオブジェクト間のブリッジとして機能するマッピングファイルを設計または設定するために使用されるCayenneモデラープラグインを設定しましょう。

<plugin>
    <groupId>org.apache.cayenne.plugins</groupId>
    <artifactId>maven-cayenne-modeler-plugin</artifactId>
    <version>4.0.M5</version>
</plugin>

手作業でXMLマッピングファイルを作成するのではなく(めったに作られません)、Cayenneディストリビューションに付属のかなり高度なツールであるモデラーを使用することをお勧めします。

お使いのOSに応じてこのhttp://cayenne.apache.org/download.html[archive]からダウンロードできます。またはMavenプラグインとして含まれているクロスプラットフォームバージョン(JAR)をそのまま使用してください。

Maven Centralリポジトリはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22cayenne-server%22[Apache Cayenne]、https://search.mavenの最新バージョンをホストしています。 org/classic/#search%7Cga%7C1%7Ca%3A%22cayenne-modeler-maven-plugin%22[彼のモデラー]、およびhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg %3A%22mysql%22%20AND%20a%3A%22mysql-connector-java%22[MySQL Connector]。

次に、 mvn install を使用してプロジェクトをビルドし、 mvn cayenne-modeler:run コマンドを使用してモデラーGUIを起動し、この画面に出力を表示します。

リンク:/uploads/Screen1-1024x615.png%201024w[]

3セットアップ

Apache Cayenneが正しいローカルデータベースを検索できるようにするには、彼の設定ファイルに正しいドライバ、URL、および resources ディレクトリにある cayenne-project.xml ファイルのユーザーを入力するだけです。

<?xml version="1.0" encoding="utf-8"?>
<domain project-version="9">
    <node name="datanode"
          factory
      ="org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory"
          schema-update-strategy
      ="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy">
        <data-source>
            <driver value="com.mysql.jdbc.Driver"/>
            <url value
              ="jdbc:mysql://localhost:3306/intro__cayenne;create=true"/>
            <connectionPool min="1" max="1"/>
            <login userName="root" password="root"/>
        </data-source>
    </node>
</domain>

ここで私たちはそれを見ることができます:

  • ローカルデータベースは intro cayenne__という名前です

  • まだ作成されていない場合は、Cayenneが作成します。

  • ユーザー名 root とパスワード root を使用して接続します(変更してください)

データベース管理システムに登録されているユーザーに応じて)

内部的には、 DataNodeDescriptor に関連付けられているXMLリソースからJDBC接続情報をロードするのは、 XMLPoolingDataSourceFactory です。

このライブラリはさまざまなデータベースをサポートできるため、これらのパラメータはデータベース管理システムとJDBCドライバに関連していることに注意してください。

それらのそれぞれは、この詳細なhttps://cayenne.apache.org/docs/3.0/database-support.html[list]で利用可能なアダプタを持っています。バージョン4.0の完全なドキュメントはまだ入手できないので、ここでは以前のバージョンを参照してください。

** 4マッピング

4.1. モデリング

では、「プロジェクトを開く」をクリックして、プロジェクトのリソースフォルダーに移動し、ファイル__cayenne-project.xmlを選択します。

この記事では、既存のデータベースからマッピング構造を作成するか、手動で続行するかを選択しました。** この記事では、モデラーと既存のデータベースを使用してCayenneに入り、すばやく機能する方法を知る方法について説明します。

著者が多くの記事を公開または所有できるため、2つのテーブルにわたって1対多の関係を持つ intro cayenne__データベースを見てみましょう。

  • 著者:id(PK) name

  • 記事:id(PK)、title、content 、および author id(FK)__

それでは「 Tools> Reengineer Database Schema 」に進みましょう。そうすれば、すべてのマッピング設定が自動的に埋められます。プロンプト画面で、 cayenne-project.xml ファイルのそこにある利用可能なデータソース設定を入力してcontinueを押します。

リンク:/uploads/Capture-d’ccran-2017-09-26-à-02.55.12-300x164.png%20300w

次の画面では、次のように「Use Java primitive types」をチェックする必要があります。

また、 com.baeldung.apachecayenne.persistent をJavaパッケージとして入れて保存する必要があります。 XML設定ファイルの defaultPackage プロパティがJavaパッケージと一致するように更新されていることがわかります。

次の図に示すように、各 ObjEntity でサブクラスのパッケージを指定し、 「保存」 アイコンをもう一度クリックする必要があります。

リンク:/uploads/Screen5-1024x609.png%201024w[]

[ツール]>[クラスの生成]メニューで、タイプとして[ 永続オブジェクトの標準化 ]を選択します。そして、「クラス」タブですべてのクラスをチェックし、「生成」__を押します。

ソースコードに戻って、 __Article.java __Author.java について話しながら、永続オブジェクトが正常に生成されたことを確認します。

これらすべての設定は、同じく resources フォルダーにある datamap.map.xml ファイルに保存されています。

4.2. マッピング構造

リソースフォルダにある生成されたXMLマッピングファイルは、Apache Cayenneに関連するいくつかの固有のタグを使用しています。

  • DataNode(<node>) - データベースのモデル、その内容すべて

データベースに接続するために必要な情報( データベース、ドライバ、およびユーザ認証情報) ** DataMap(<data-map>) - これは永続エンティティのコンテナです。

彼らの関係 ** DbAttribute(<db-attribute>) - データベース内の列を表します

表 ** DbEntity(<db-entity>) - 単一のデータベーステーブルのモデル

ビュー、それはDbAttributesとの関係を持つことができます ** ObjEntity(<obj-entity>) - 単一の永続Javaのモデル

クラス;エンティティクラスのプロパティに対応するObjAttributesからなる ObjRelationshipsは、別のタイプのプロパティです。 エンティティ ** Embeddable(<embeddable>) - として機能するJavaクラスのモデル

ObjEntityのプロパティですが、 データベース ** Procedure(<procedure>) - ストアドプロシージャを登録する

データベース ** Query(<query>) - クエリのモデル。クエリのマッピングに使用されます。

設定ファイルは忘れずにコードでも実行できます

これは完全なhttps://cayenne.apache.org/docs/3.1/cayenne-guide/cayenne-mapping-structure.html[details]です。

5 Cayenne API

残りの唯一のステップは、Cayenne APIを使用して生成されたクラスを使用してデータベース操作を実行することです。ただし、永続クラスのサブクラス化は後でモデルをカスタマイズするためのベストプラクティスです。

5.1. オブジェクトを作成する

ここでは、 Author オブジェクトを保存し、後でデータベースにこのタイプのレコードが1つしかないことを確認します。

@Test
public void whenInsert__thenWeGetOneRecordInTheDatabase() {
    Author author = context.newObject(Author.class);
    author.setName("Paul");

    context.commitChanges();

    long records = ObjectSelect.dataRowQuery(Author.class)
      .selectCount(context);

    assertEquals(1, records);
}

5.2. オブジェクトを読む

Author を保存した後、特定のプロパティによる単純なクエリを介して他のものの中から選択します。

@Test
public void whenInsert__andQueryByFirstName__thenWeGetTheAuthor() {
    Author author = context.newObject(Author.class);
    author.setName("Paul");

    context.commitChanges();

    Author expectedAuthor = ObjectSelect.query(Author.class)
      .where(Author.NAME.eq("Paul"))
      .selectOne(context);

    assertEquals("Paul", expectedAuthor.getName());
}

5.3. クラスの全レコードを取得する

2人の著者を保存し、著者オブジェクトのコレクションを取得して、2人だけが保存されていることを確認します。

@Test
public void whenInsert__andQueryAll__thenWeGetTwoAuthors() {
    Author firstAuthor = context.newObject(Author.class);
    firstAuthor.setName("Paul");

    Author secondAuthor = context.newObject(Author.class);
    secondAuthor.setName("Ludovic");

    context.commitChanges();

    List<Author> authors = ObjectSelect
      .query(Author.class)
      .select(context);

    assertEquals(2, authors.size());
}

5.4. オブジェクトを更新する

更新プロセスも簡単ですが、プロパティを変更してデータベースに適用する前に、まず目的のオブジェクトを用意する必要があります。

@Test
public void whenUpdating__thenWeGetAnUpatedeAuthor() {
    Author author = context.newObject(Author.class);
    author.setName("Paul");
    context.commitChanges();

    Author expectedAuthor = ObjectSelect.query(Author.class)
      .where(Author.NAME.eq("Paul"))
      .selectOne(context);
    expectedAuthor.setName("Garcia");
    context.commitChanges();

    assertEquals(author.getName(), expectedAuthor.getName());
}

5.5. オブジェクトを取り付ける

記事を作者に割り当てることができます。

@Test
public void whenAttachingToArticle__thenTheRelationIsMade() {
    Author author = context.newObject(Author.class);
    author.setName("Paul");

    Article article = context.newObject(Article.class);
    article.setTitle("My post title");
    article.setContent("The content");
    article.setAuthor(author);

    context.commitChanges();

    Author expectedAuthor = ObjectSelect.query(Author.class)
      .where(Author.NAME.eq("Smith"))
      .selectOne(context);

    Article expectedArticle = (expectedAuthor.getArticles()).get(0);

    assertEquals(article.getTitle(), expectedArticle.getTitle());
}

5.6. オブジェクトを削除する

保存されたオブジェクトを削除すると、データベースから完全に削除されます。その後、クエリの結果として null が表示されます。

@Test
public void whenDeleting__thenWeLostHisDetails() {
    Author author = context.newObject(Author.class);
    author.setName("Paul");
    context.commitChanges();

    Author savedAuthor = ObjectSelect.query(Author.class)
      .where(Author.NAME.eq("Paul"))
      .selectOne(context);
    if(savedAuthor != null) {
        context.deleteObjects(author);
        context.commitChanges();
    }

    Author expectedAuthor = ObjectSelect.query(Author.class)
      .where(Author.NAME.eq("Paul"))
      .selectOne(context);

    assertNull(expectedAuthor);
}

5.7. クラスの全レコードを削除

SQLTemplateを使用してテーブルのすべてのレコードを削除することも可能です。ここでは各テストが開始される前に常に無効なデータベースを持つために各テストメソッドの後にこれを行います _: _

@After
public void deleteAllRecords() {
    SQLTemplate deleteArticles = new SQLTemplate(
      Article.class, "delete from article");
    SQLTemplate deleteAuthors = new SQLTemplate(
      Author.class, "delete from author");

    context.performGenericQuery(deleteArticles);
    context.performGenericQuery(deleteAuthors);
}

6. 結論

このチュートリアルでは、Apache Cayenne ORMを使用して、1対多の関係でCRUD操作を実行する方法を簡単に説明しました。

いつものように、この記事のソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/apache-cayenne[GitHubに載っています]。