アソシエーションおよび化学物質構造の使用

Objective

After completing this lesson, you will be able to アソシエーションを使用したエンティティ間の関係の取得

管理対象 To-One アソシエーション

アソシエーションは、エンティティ間の関係を定義するために使用されます。

図 "ブックから作成者へのアソシエーション" に示す例では、Books エンティティの author 要素を使用して、Books と Authors 間のアソシエーションが定義されています。この要素は Authors エンティティへのリンクを作成します。このエンティティは、Books エンティティから関連付けられた作成者にナビゲートして、作成者名などの詳細を取得できる関係を確立します。

舞台裏

サンプルコードの To-One アソシエーション Books:author は、いわゆる管理対象アソシエーションであり、外部キー項目および on 条件がバックグラウンドで自動的に追加されます。

CDS では、有効化時に、ターゲットの一次キー (Authors エンティティ) に基づいて、外部キー項目 author_ID が SQL データベースに自動的に追加され (図 " 生成された外部キー項目 " を参照)、対応する結合条件が暗黙的に追加されます。

管理対象アソシエーションに加えて、管理対象外アソシエーションを使用することもできます。管理対象外アソシエーションでは、on 句で任意の結合条件が明示的に指定されます。この結合条件は、利用可能な外部キー項目を参照します。

注記

モデルの簡潔さと分かりやすさのために、常に 1 対 1 のアソシエーションに対して管理対象アソシエーションをお奨めします。

次に、対多アソシエーションの例について説明します。

To-Many アソシエーション

著者は、任意の数の本を書くことができます。つまり、1 人の著者が 1 冊の本、1 冊の本、または複数の本に関連付けることができます。

図 "作成者からブックへのアソシエーション" は、このような対多のアソシエーションが CDS モデルでどのように定義されるかを示しています。

Authors エンティティと Books ターゲットエンティティの関係は、Authors エンティティのbooks 要素によって指定されます。構文 Association to many Books は、著者が任意の数の本に関連付けられていることを示します。

on 条件では、アソシエーション名 books がリンクされる Books ターゲットエンティティのエイリアスとして使用されます。on books.author = $self 句は、Books エンティティの author フィールドを使用して Authors エンティティへのリンクを作成することを指定します。$self は、作成者の現在のインスタンスを参照するプレースホルダです。

通常、以下のパターンに従った式は、対多のアソシエーションの on 条件で指定されます。

<assoc>.<backlink> = $self

バックリンクは、片側を指す多面的な任意の管理対 1 アソシエーションにすることができます。

注記

現在、CDS では多対多のアソシエーションに対する特別なサポートは提供されていません。したがって、リンクエンティティを使用して 2 つの 1 対多のアソシエーションへの多対多のアソシエーションを解決し、2 つのアソシエーションを接続する必要があります。

化学物質構造

CAP では、アソシエーションに加えて、化学物質構造のモデリングもサポートされています。

アソシエーションは、互いに独立して存在できるエンティティ (著者や書籍など) に関連します。

一方、化学物質構造は包含関係を表し、文書構造のモデル化に使用されます。受注や受注明細など、多数のヘッダ-子シナリオで頻繁に表示されます。

構成とは、子エンティティ (受注明細) が全体の一部であり、親エンティティ (オーダー) から独立して存在できないことを意味します。子エンティティは親エンティティに含まれており、親エンティティを介してのみアクセスできます。

図 " 構成の例 " は、CDS での構造の定義方法を示しています。表示される化学物質構造により、OrdersOrderItems の間の 1 対多の関係が定義されます。構文は、1 対多のアソシエーションの定義によく似ています。唯一の違いは、一方では句 Composition of ではなく、句 Association to です (上記の著者と本の関連付けを比較してください)。

CAP ランタイムでは、一部の点で化学物質構造がアソシエーションとは異なる方法で処理されます。特に、化学物質構造には以下の特殊機能があります。

  • カスケード削除

    オーダーを削除すると、化学物質構造関係により、そのオーダー明細もすべて削除されます。

  • ディープ挿入

    生成された OData サービスでは、オーダーと含まれているオーダー明細の両方を 1 つの POST 要求で登録することができます。

次に、サービスインタフェースでアソシエーションを公開する方法について説明します。

サービスインタフェースでのアソシエーションの公開

射影でのアソシエーションの公開

通常のエレメントなどのアソシエーションをビュー (as select from ) または射影 (as projection on ) の選択一覧に追加することができます。select * には、すべてのアソシエーションが含まれます。

図 " 射影の公開 " に、AdminService を介して公開されるシナリオの 2 つの射影 AdminService.Books および AdminService.Authors を示します。AdminService.Books 射影の有効署名には、com.sap.learning.Books エンティティの作成者アソシエーションと同じプロパティを持つ作成者アソシエーションが含まれています。同様に、AdminService.Authors 射影の署名には、com.sap.learning.Authors エンティティのbooks アソシエーションと同じプロパティを持つ books アソシエーションが含まれています。

自動リダイレクトアソシエーション

図 " 射影の公開 " に示されているAdminService により、基礎となるデータモデルからのエンティティに関する 2 つの射影が公開されます。

関連するエンティティを公開すると、アソシエーションが自動的にリダイレクトされます。これにより、お客様は予測されるエンティティ間を予想どおりにナビゲートできるようになります (図 "リダイレクトされたアソシエーション" を参照)。つまり、AdminService.Authors.bookscom.sap.learning.Booksではなく AdminService.Books を指しています。同様に、AdminService.Books.authorcom.sap.learning.Authors ではなく AdminService.Authors を参照します。

ナビゲーションプロパティ

生成された OData サービスでは、公開されたアソシエーションを同じ名称のナビゲーションプロパティとして使用することができます。

図 " 生成済ナビゲーションプロパティ " は、サービスメタデータ文書の対応する抜粋を示しています。エンティティタイプ Books にはナビゲーションプロパティ author があり、エンティティタイプ Authors にはナビゲーションプロパティbooks があります。

デモおよび演習: ドメインモデルへのアソシエーションの追加

注記

演習問題として、SAP Business Application Studio で、以下のデモのステップバイステップの手順を実行します。

演習の開始点として、前の演習問題 " 開発用初期データを使用した永続 SQLite データベースの設定 " の結果を使用します (正常に完了している場合)。または、以下の GitHub リポジトリのブランチ 4_SQLite_database を開始点として使用することもできます。

https://github.com/SAP-samples/cap-development-learning-journey

シミュレーションの完全な実装は、GitHub リポジトリの 5_associations ブランチにあります。

リポジトリのコンテンツとその使用方法の詳細については、ここを参照してください。

ドメインモデルにアソシエーションを追加する方法については、ビデオを視聴してください。

次に、いわゆるアスペクトを使用して、新しいエレメントでエンティティ定義を拡張する方法について説明します。