ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Adaptive Access Manager開発者ガイド
11gリリース2(11.1.2)
B71697-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

5 エンティティAPIを使用したエンティティの作成、更新および検索

この章では、アプリケーションでエンティティAPIを使用してエンティティの作成、更新および検索を実行する方法について説明します。これらの項目が含まれます。

5.1 エンティティAPIについて

OAAMには、不正検出を促進するエンティティとエンティティ関係をアプリケーションで管理するための2つのエンティティAPIが用意されています。

5.1.1 エンティティ・タスク

エンティティAPIは、アプリケーションでデータベース内のエンティティに対する作成、更新、置換および検索の各操作を実行することを可能にします。エンティティAPIによって、次の操作が実行できます。

  • OAAMデータベース・スキーマでエンティティを作成および更新する。

  • エンティティ属性を置換またはマージする。

  • エンティティを検索する。

データベース内のクライアントのトランザクション・データに対して実行されるエンティティ・タスクは、次の情報を必要とします。

  • エンティティ・キーは、OAAM管理でエンティティ定義を作成する際に管理者が指定するキーです。

  • エンティティ・データは、クライアント・アプリケーションのユーザーが入力するデータです。

  • リンクされたエンティティ関係名は、OAAM管理でエンティティ定義を作成する際に管理者が指定する名前です。リンクされたエンティティ関係名は、複雑なエンティティ・インスタンスでのみ必要です。

5.1.2 処理ステータス

VCryptObjectResponseには、処理のステータスに関する情報が含まれています。

エンティティの作成と更新APIの戻り型: VCryptObjectResponse:

結果 説明

SUCCESS

SUCCESS: APIの実行が成功し(データベース・エラーまたは接続エラーがありません)、少なくとも1つのエンティティが作成されます。

response.getObject()は、個別エンティティのVCryptObjectResponseが含まれている配列オブジェクトを返します。各レスポンス・オブジェクトには、SUCCESS時のEntityHeaderオブジェクトが含まれています。response.isSuccess()に対する問合せ。(SUCCESSの場合はtrueERRORの場合はfalse)。

ERROR

エンティティが作成されなかった場合は、ERRORになります。

response.getObject()は、VCryptObjectResponseが含まれているオブジェクトを返します。各レスポンス・オブジェクトには、ERROR時のエラー・メッセージが含まれています。


エンティティ検索APIの戻り型: VCryptObjectResponse

戻りオブジェクト 説明

VCryptObjectResponse

SUCCESS時のエンティティ・オブジェクトであるEntityHeaderオブジェクト、またはERROR時のエラー・メッセージが含まれています。


5.1.3 エンティティの作成または更新

createOrUpdateEntities APIを使用すると、次のタスクを実行できます。

  • エンティティを作成および更新する。

  • エンティティ更新時に属性値を置換およびマージする。

エンティティを作成すると、エンティティ・データ・マップから主キーの値を使用して一意のキーが生成されます。OAAMでは、このキーを使用して、エンティティがすでにデータベースに存在するかどうかが確認されます。エンティティが存在していない場合はエンティティが作成され、存在している場合は更新されます。エンティティの更新は、エンティティ・データ・マップで指定したデータに基づいて行われます。

entityIdを使用して既存エンティティの属性値を削除するには、次のようにentityDataMapを移入し、isReplaceEntity(createOrUpdateEntityにある)パラメータをtrueに設定します。

APIシグネチャ:

public VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> createOrUpdateEntities(EntityData[] entityRequestData,boolean isReplaceEntity, int commitBatchSize, String requestId);

パラメータ:

パラメータ 説明

entityRequestData

EntityDataオブジェクトの配列。EntityDataオブジェクトには、1つのエンティティの作成に必要な情報が含まれています。EntityData.javaの詳細は、リリース11gの『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

isReplaceEntity

エンティティの更新時に属性の置換またはマージを判別するためのフラグ。デフォルト値: FALSE(マージを指定)。

commitBatchSize

同時にコミットする必要のあるエンティティの数を判別します。デフォルトおよび最小値は1です。

requestId

セッションを識別する値。この値はクライアントによって送信されます。クライアントでこの値が設定されていない場合は、ダミーの数値が生成されます。


5.1.4 属性の置換またはマージ

属性の置換またはマージ: エンティティの更新時に、属性をマージするか、または置換するかを選択できます。この2つのモードの相違点は、エンティティ・データの属性に対してユーザーが値を渡す場合にのみ確認できます。mergeの場合、属性の値は変更されず、古い値が保持されます。replaceの場合、古い値のかわりに空の値が表示され、属性は空の値によって置換されます。デフォルトのオプションはmergeです。

5.1.5 キーによるエンティティの検索

searchEntityByKey APIを使用すると、キー属性に基づいてエンティティを検索できます。

APIシグネチャ:

public VCryptObjectResponse<EntityHeader> searchEntityByKey(EntityData entityData);

パラメータ:

パラメータ 説明

entityData

IDスキームに基づいて検索されるエンティティの主キー属性のキーと値が含まれている、entityNameおよびentityDataMapを持つEntityDataオブジェクト。


5.2 エンティティとマッピング属性の作成

この項では、不正検出におけるエンティティ解決に使用されるマッピング属性について説明します。

5.2.1 エンティティ・データ・マップ

エンティティ・データ・マップは、エンティティの作成に使用されます。これには、属性名のキーと値のペアと、ユーザーが指定したその値が含まれています。たとえば、タイプCustomerのエンティティを作成する場合、次のようなデータ・マップが考えられます。

エンティティ・データ・マップ:

キー: 名 値: Mark

キー: 姓

値: Henry

キー: 電子メール

値: x@y.com

キー: shipping.addr_line1

値: #1, Lex residence

キー: shipping.addr_line2

値: Redmond street

キー: shipping.zip

値: 418001

キー: shipping.phone_number

値: 9876543210


5.2.2 複雑なエンティティ

複雑なエンティティには、他のエンティティが関係名によってリンクされています。たとえば、Customerは、後続の例に示す属性によって定義できます。その他のエンティティは、関係名によってリンクされています。

複雑なエンティティを作成するためのデータを受信するには、エンティティ・データ・マップのキーでドット規則を使用します。データ・マップのリンクされたエンティティの属性名の前に、関係名とドット(.)を1つ付ける必要があります。

:

エンティティそのものをエンティティの属性にできます。そのような属性はリンクされたエンティティと呼ばれます。たとえば、Shipping addressはエンティティCustomerのリンクされたエンティティです。

カスタマ: 名(単純な属性)

姓(単純な属性)

電話(単純な属性)

電子メール(単純な属性)

出荷先住所: addr_line1

addr_line2

市区町村

都道府県

携帯電話

郵便番号

請求先住所: addr_line1

addr_line2

市区町村

都道府県

携帯電話

郵便番号

5.2.3 単純なエンティティの作成

単純なエンティティとは、その他のエンティティにリンクされていないエンティティのことです。エンティティ・インスタンスを作成すると、エンティティ関連データがデータベースに格納されます。

EntityDataオブジェクトは、次のパラメータを取ります。

エンティティ名: エンティティ名によって、作成されるエンティティのタイプが判別されます。たとえば、Customerがあります。このエンティティ・タイプの定義は、エンティティ作成用のデータベースにすでに存在します。

エンティティ・データ・マップ: エンティティ・データ・マップには、属性名のキーと値のペアと、ユーザーによって指定された値が含まれています。関連するエンティティを持たない単純なエンティティを作成するには、次のようにentityDataMapを移入します。

キー

キー: <attributeName1>

値: <attributeValue1>

キー: <attributeName2>

値: <attributeValue2>

キー: <attributeName3>

値: <attributeValue3>


たとえば、関連するエンティティを持たないCustomerエンティティを作成します。

コンテキスト・データ

キー: 名

値: Mark

キー: 姓

値: Henry

キー: 電子メール

値: x@y.com

キー: 携帯電話

値: 9876543210


単純なエンティティ・インスタンスを作成するには、次の手順を実行します。

  1. エンティティ・データが含まれているマップを作成します。

    マップのキーはエンティティの属性名(OAAM管理で指定したもの)、マップの値はユーザー入力値です。

    後続の例では、Customerエンティティ・データのデータが表示され、ユーザー入力としてMark Henryという名前が表示されています。Customerエンティティには、属性としてfirst nameおよびlast nameが設定されています。

    Map<String,String> entityDataMap = new HashMap<String,String>(); entityDataMap.put("first name","Mark"); entityDataMap.put("last name","Henry");

  2. エンティティ・データ・マップとエンティティ・タイプをカプセル化しているEntityDataオブジェクトを作成します。たとえば、Customerがあります。

    EntityData entityData= new EntityData("Customer",entityDataMap);

  3. このAPIはEntityDataの配列のみを受け入れるため、配列を作成し、作成されたentitydataをその中に挿入します。

    EntityData[] entityRequestData= new EntityData[1]; entityRequestData[0]= entityData;

  4. 最後に、API trackerをコールします。これはVCryptTrackerインスタンスです。

    response =

    tracker.createOrUpdateEntities(entityRequestData, true, commitBatchSize,requestId);

エンティティ・インスタンスを次の方法で作成しようとすると、エラーが発生します。

  • 存在していないエンティティを使用した場合。

  • エンティティ名としてNULLを使用した場合。

  • 必須情報を指定しなかった場合。

  • 必須情報としてNULL値を使用した場合。

  • 一致しないエンティティのデータ型を使用した場合。

  • エンティティ定義と比較してまったく異なるエンティティ・データを使用した場合。

5.2.4 既存エンティティの属性の更新

既存エンティティの属性を更新するには、createOrUpdateEntities APIを使用します。

entityId ($id$)

idは、データベースに格納されたエンティティIDの値です。エンティティのすべてのキー属性の値を渡す必要があります。これによって、データベース内のエンティティ・インスタンスが一意に識別されます。

entityId($id$)をcreateOrUpdateEntity APIのレスポンスから取得します。たとえば、次のようになります。

VCryptObjectResponse<EntityHeader>[] responseArray = response.getObject();
VCryptObjectResponse<EntityHeader> entityResponse = responseArray[0];
 
EntityHeader entityHeader = entityResponse.getObject();
Long entityId= entityHeader.getEntityId();

entityIdを使用して既存エンティティの属性を更新するには、entityDataMapを次のように移入します。

entityDataMap:

キー: $id$ 値: <EntityId>

キー: <attributeName1>

値: <attributeValue1>

キー: <attributeName2>

値: <attributeValue2>


たとえば、Customerエンティティの電子メールIDを101というentityIdで更新します。

キー: $id$ 値: 101

キー: 電子メール

値: a@b.com


エンティティ・インスタンスを更新するには、次の2つの方法があります。

たとえば、次のようになります。

カスタマ(101):           名            ->            Mark

                                          姓             ->            Henry

                                          携帯電話                  ->            0987654321

                                          電子メール                    ->            x@y.com

前述の例では、エンティティID101を持つタイプCustomerのエンティティが使用されています。その電子メールをa@b.comに変更する場合、エンティティ・データを渡すための2つの方法があります。

最初の方法は、次のとおりです。

$id$                    ->             101

電子メールl                  ->             a@b.com

2つ目の方法は、次のとおりです。

名             ->            Mark

姓             ->            Henry

電子メール                     ->            a@b.com

5.2.5 既存エンティティの属性値の削除

entityIdを使用して既存エンティティの属性値を削除するには、次のようにentityDataMapを移入し、isReplaceEntity(createOrUpdateEntityにある)パラメータをtrueに設定します。

entityDataMap:

キー: $id$ 値: <EntityId>

キー: <attributeName1>

値:

キー: <attributeName2>

値:


たとえば、entityIdとして101を持つCustomerエンティティの電子メールIDを削除します。

キー: $id$ 値: 101

キー: 電子メール



5.2.6 最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティを持つエンティティの作成

最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティを持つエンティティを作成するには、次のフォーマットを使用します。

entityDataMap:

キー: <attributeName1> 値: <attributeValue1>

キー: <attributeName2>

値: <attributeValue2>

キー: <attributeName3>

値: <attributeValue3>

キー: <relationshipName1>.<attributeName1>

値: <linkedEnt1AttributeValue1>

キー: <relationshipName1>.<attributeName2>

値: <linkedEnt1AttributeValue2>

キー: <relationshipName2>.<attributeName1>

値: <linkedEnt2AttributeValue1>


出荷先は、Customeraddressタイプの別のエンティティにリンクする関係名です。複雑なエンティティを作成するためのデータを受信するには、エンティティ・データ・マップのキーでドット規則を使用します。データ・マップのリンクされたエンティティの属性名の前に、関係名とドット(.)を1つ付ける必要があります。

例: 出荷先および請求先のrelationshipNamesを持つ、リンクされた住所エンティティが含まれているCustomerエンティティを作成します。

キー: 名 値: Mark

キー: 姓

値: Henry

キー: 電子メール

値: x@y.com

キー: shipping.addr_line1

値: #1, Lex residence

キー: shipping.addr_line2

値: Redmond street

キー: billing.addr_line1

値: #2, Lex residence


5.2.7 最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティ(単一エンティティの複数のインスタンスを含む)を持つエンティティの作成

最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティ(単一の関係の複数のインスタンスを含む)を持つエンティティを作成するには、createOrUpdateEntities() APIを使用します。

entityDataMap:

キー: <attributeName1> 値: <attributeValue1>

キー: <attributeName2>

値: <attributeValue2>

キー: <attributeName3>

値: <attributeValue3>

キー: <relationshipName1>[<index1>].<attributeName1>

値: <linkedEnt1AttributeValue1>

キー: <relationshipName1>[<index1>].<attributeName2>

値: <linkedEnt1AttributeValue2>

キー: <relationshipName1>[<index2>].<attributeName1>

値: <linkedEnt2AttributeValue1>

キー: <relationshipName1>[<index2>].<attributeName2>

値: <linkedEnt2AttributeValue2>

キー: <relationshipName2>.<attributeName1>

値: <linkedEnt3AttributeValue1>


例: 出荷先および出荷先の2つのインスタンスが存在する請求先をrelationshipNamesに持つ、リンクされた住所エンティティが含まれているCustomerエンティティを作成します。

キー: 名 値: Mark

キー: 姓

値: Henry

キー: 電子メール

値: x@y.com

キー: shipping[0].addr_line1

値: #1, Lex residence

キー: shipping[0].addr_line2

値: Redmond street

キー: shipping[1].addr_line1

値: #3, Lex residence

キー: shipping[1].addr_line2

値: Redwood street

キー: billing.addr_line1

値: #2, Lex residence


5.2.8 最上位レベルのエンティティと1つ以上の関連エンティティのエンティティIDによる完全なデータを含む関連エンティティを持つエンティティの作成

最上位レベルのエンティティと1つ以上の関連エンティティのエンティティIDによる完全なデータを含む関連エンティティを持つエンティティを作成するには、次のようにします。

entityDataMap:

キー: <attributeName1> 値: <attributeValue1>

キー: <attributeName2>

値: <attributeValue2>

キー: <attributeName3>

値: <attributeValue3>

キー: <relationshipName1>[<index1>].<attributeName1>

値: <linkedEnt1AttributeValue1>

キー: <relationshipName1>[<index1>].<attributeName2>

値: <linkedEnt1AttributeValue2>

キー: <relationshipName1>[<index2>].$id$

値: <linkedEnt2EntityId>

キー: <relationshipName2>.<attributeName1>

値: <linkedEnt3AttributeValue1>


例: shipping(出荷先)および出荷先の2つのインスタンスが存在するbilling(請求先)をrelationshipNamesに持つ、リンクされたaddress(住所)エンティティが含まれているCustomerを作成します。shipping addressエンティティの1つはすでに存在しており、102というentityIdを持っています。

キー: 名 値: Mark

キー: 姓

値: Henry

キー: 電子メール

値: x@y.com

キー: shipping[0].addr_line1

値: #1, Lex residence

キー: shipping[0].addr_line2

値: Redmond street

キー: shipping[1].$id$

値: 102

キー: billing.addr_line1

値: #2, Lex residence


リンクされたエンティティ・インスタンスを次の方法で作成しようとすると、エラーが発生します。

  • 存在しないリンクされたエンティティ名を使用した場合。

  • 空のリンクされたエンティティ名を使用した場合。

  • 必須のリンクされたエンティティ・データをすべて指定しなかった場合。

  • 必須のリンクされたエンティティ・データにNULL値を指定した場合。

  • 一致しないリンクされたエンティティ・データのデータ型を使用した場合。

  • エンティティ定義と比較してまったく異なるリンクされたエンティティ・データを使用した場合。

  • リンクされたエンティティのタイプが親と同じ場合。

リンクされたエンティティ(マルチレベル)のタイプが親と同じである複雑なエンティティ・インスタンスを作成した場合、そのエンティティ・インスタンスはエラー・ステータス付きで作成されます。このような定義は許可されていないため、エンティティ定義の不一致によってエラーが発生します。

5.2.9 関連エンティティのエンティティIDを持つエンティティの関連エンティティの更新

関連エンティティのエンティティIDを持つエンティティの関連エンティティを更新するには、次のようにします。

entityDataMap:

キー: <attributeName1> 値: <attributeValue1>

キー: <attributeName2>

値: <attributeValue2>

キー: <relationshipName1>.$id$

値: <linkedEnt1EntityId>

キー: <relationshipName1>.<attributeName1>

値: <linkedEnt1AttributeValue1>


注意: 親エンティティの属性のかわりに、親のentityIdを渡すこともできます。

例: カスタマMark Henryの請求先住所の都市をChicagoに更新します。この請求先住所は、103entityIdですでに存在しています。

キー: 名 値: Mark

キー: 姓

値: Henry

キー: billing.$id$

値: 103

キー: billing.city

値: Chicago


5.2.10 リンクされたエンティティのリンク解除

1つ以上の関連エンティティを親エンティティからリンク解除できます。

カスタマ:                     名:: abc

                                       : 姓:: xyz

                                       : 携帯電話:: 9876543210

                                       : 電子メール:: p@q.com

                                       : 出荷先住所:: (id=102のエンティティ)

                                       : 出荷先住所:: (id=105のエンティティ)

                                       : 請求先住所:: (id=103のエンティティ)

unLinkEntities: 削除対象の関係のmapIdのリスト。mapIdはLong型です。mapIdは、エンティティ・オブジェクト内のlinkedEntitiesとして返されるVTEntityOneMapオブジェクトのリストからフェッチできます。

unlinkEntities:

値(リスト形式)

102,105

103


エンティティ・インスタンスの更新中にunlinkEntitiesがnullと指定された場合、既存のエンティティ関係は変更されません。親エンティティに以前に関連付けられていた、更新操作に関するエンティティ関係はすべて存続します。ただし、更新中に新規の関係を(エンティティ・データ・マップを使用して)追加できます。

エンティティを次の方法でリンク解除しようとすると、エラーが発生します。

  • 既存のエンティティ・インスタンスに対応していない必須属性を渡した場合。

  • NULLまたは空のエンティティID値を渡した場合。

  • 親エンティティIDを渡して、必須属性を削除した場合。

  • 存在しないエンティティIDを渡した場合。

  • 重複するエンティティIDを渡した場合。

コード例

    public void testDeleteRelationships() throws Exception{
    boolean isReplaceEntity = false;
    int commitBatchSize=1;
    String timeStamp = Long.toString(System.currentTimeMillis());
    EntityData[] entityRequestData= new EntityData[1];
    Map<String,String> entityDataMap = new HashMap<String,String>(); 
         entityDataMap.put("first name","Mark"+timeStamp);
         entityDataMap.put("last name","Henry"+timeStamp);
         entityDataMap.put("email","x@y.com");
         entityDataMap.put("mobile","9876543210");    
    EntityData entityData= new EntityData("customer",entityDataMap); 
    entityRequestData[0]= entityData;
    String requestId= null; 
    VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> response =  vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity, commitBatchSize,requestId);
    assertTrue(response.isSuccess());
    VCryptObjectResponse<EntityHeader>[] responseArray= response.getObject();
    VCryptObjectResponse<EntityHeader> entityResponse= responseArray[0];
    assertTrue(entityResponse.isSuccess());
    EntityHeader entity = entityResponse.getObject();
    Long customerEntityId= entity.getEntityId();
    
    // creating an address
    Map<String,String> entityDataMapAddress1 = new HashMap<String,String>(); 
         entityDataMapAddress1.put("addr_line1","testHouse1b"+timeStamp);
         entityDataMapAddress1.put("addr_line2","testStreet1b");
         entityDataMapAddress1.put("addr_line3","testlane1b");
         entityDataMapAddress1.put("city","city1");
         entityDataMapAddress1.put("state","state1");
         entityDataMapAddress1.put("country","country1");
         entityDataMapAddress1.put("zip","333031");
         entityDataMapAddress1.put("phone","9876543210");  
    EntityData entityDataAddress1= new EntityData("address",entityDataMapAddress1);
    entityRequestData[0]= entityDataAddress1;
    VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseAddress1 =  vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity, commitBatchSize,requestId);
    assertTrue(responseAddress1.isSuccess());
    VCryptObjectResponse<EntityHeader>[] responseArrayAddress1= responseAddress1.getObject();
    VCryptObjectResponse<EntityHeader> entityResponseAddress1= responseArrayAddress1[0];
    assertTrue(entityResponseAddress1.isSuccess());
    EntityHeader entityAddress1 = entityResponseAddress1.getObject();
    Long address1EntityId= entityAddress1.getEntityId();
    
    // creating another address
    Map<String,String> entityDataMapAddress2 = new HashMap<String,String>(); 
    entityDataMapAddress2.put("addr_line1","testHouse2"+timeStamp);
    entityDataMapAddress2.put("addr_line2","testStreet2");
    entityDataMapAddress2.put("addr_line3","testlane2");
    entityDataMapAddress2.put("city","city2");
    entityDataMapAddress2.put("state","state2");
    entityDataMapAddress2.put("country","country2");
    entityDataMapAddress2.put("zip","333031");
    entityDataMapAddress2.put("phone","9876543210");  
    EntityData entityDataAddress2= new EntityData("address",entityDataMapAddress2);
    entityRequestData[0]= entityDataAddress2;
    VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseAddress2 =  vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity, commitBatchSize,requestId);
    assertTrue(responseAddress2.isSuccess());
    VCryptObjectResponse<EntityHeader>[] responseArrayAddress2= responseAddress2.getObject();
    VCryptObjectResponse<EntityHeader> entityResponseAddress2= responseArrayAddress2[0];
    assertTrue(entityResponseAddress2.isSuccess());
    EntityHeader entityAddress2 = entityResponseAddress2.getObject();
    Long address2EntityId= entityAddress2.getEntityId();
    
    // creating relationships between the customer and addresses
    Map<String,String> entityDataMapRelation = new HashMap<String,String>(); 
    entityDataMapRelation.put("$id$",customerEntityId.toString());
    entityDataMapRelation.put("shipping.$id$",address1EntityId.toString());
    entityDataMapRelation.put("billing[0].$id$",address1EntityId.toString());
    entityDataMapRelation.put("billing[1].$id$",address2EntityId.toString());   
    EntityData entityDataRelation= new EntityData("customer",entityDataMapRelation);
    entityRequestData[0]= entityDataRelation;
    VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseRelation =  vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity, commitBatchSize,requestId);
    assertTrue(responseRelation.isSuccess());
    VCryptObjectResponse<EntityHeader>[] responseArrayRelation= responseRelation.getObject();
    VCryptObjectResponse<EntityHeader> entityResponseRelation= responseArrayRelation[0];
    assertTrue(entityResponseRelation.isSuccess());
    EntityHeader entityRelation = entityResponseRelation.getObject();
    Long relationEntityId= entityRelation.getEntityId();
    assertEquals(customerEntityId,relationEntityId);
    Map<String,List<Long>> linkedEntities = entityRelation.getLinkedEntities();
    VCryptDataAccessMgr dataAccessMgr = null;    
    VCryptTrackerDataAccess mTrackerDataAccess = null;
    try {                
            dataAccessMgr = new VCryptDataAccessMgr();                                        
        mTrackerDataAccess = dataAccessMgr.getVCryptTrackerDataAccess();
    }catch(Exception e) {
            logger.error("Error while creating TrackerEntityFactory instance", e);
    }
    List<VTEntityOneMap> relationships =mTrackerDataAccess.getVTEntityOneMapByEntityId(customerEntityId,new Integer(UserDefEnum.getElement(IBharosaConstants.OBJECT_TYPE_ENUM, "VTEntityDef").getValue()));
    assertEquals(relationships.size(),3);
    
    // deleting all the relationships for the customer Entity
    Map<String,List<Long>> unlinkEntities = linkedEntities;    
    Map<String,String> entityDataMapUnlink = new HashMap<String,String>();
    entityDataMapUnlink.put("$id$",customerEntityId.toString());
    EntityData entityDataUnlink= new EntityData("customer",entityDataMapUnlink,linkedEntities);
    entityRequestData[0]= entityDataUnlink;
    VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseDelRel =  vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity, commitBatchSize,requestId);
    assertTrue(responseDelRel.isSuccess());
    List<VTEntityOneMap> relationships1 =mTrackerDataAccess.getVTEntityOneMapByEntityId(customerEntityId,new Integer(UserDefEnum.getElement(IBharosaConstants.OBJECT_TYPE_ENUM, "VTEntityDef").getValue()));
    assertEquals(relationships1.size(),0);
  }

5.2.11 エンティティIDまたはキー・データに基づくエンティティの検索

Search APIは、エンティティIDまたはキー・エンティティ属性に基づくエンティティの検索に使用します。必須パラメータは、エンティティ名とエンティティ・データ・マップです。エンティティ名はエンティティ・タイプに対応し、エンティティ・データ・マップにはエンティティID、または属性名のキー/値のペアと検索対象のエンティティの値が含まれています。エンティティIDの場合、エンティティ・データ・マップは次のように指定されます。

entityDataMap:

キー

$id$

107


この例では、107が検索対象のエンティティのエンティティIDです。

APIコール

  1. 検索対象のエンティティのエンティティ・データが含まれているマップを作成します。

    マップのキーはエンティティの属性名(OAAM管理で指定したもの)、マップの値はユーザー入力値です。

    後続の例では、Customerエンティティ・データのデータが表示され、ユーザー入力としてMark Henryという名前が表示されています。Customerエンティティには、属性としてfirst nameおよびlast nameが設定されています。

    Map<String,String> entityDataMap = new HashMap<String,String>(); entityDataMap.put("first name","Mark"); entityDataMap.put("last name","Henry");

  2. エンティティ・データ・マップとエンティティ・タイプをカプセル化しているEntityDataオブジェクトを作成します。たとえば、Customerがあります。

    EntityData entityData= new EntityData("Customer",entityDataMap);

  3. 最後に、API trackerをコールします。これはVCryptTrackerインスタンスです。

    response =tracker.searchEntityByKey(entityData);

5.3 データ格納

トランザクション・インスタンスの作成中、トランザクション関連のエンティティの関係情報はデータベースに永続化されます。

5.3.1 データ・モデル

VT_USER_ENTITY1_MAPは、エンティティ関係に関する情報の格納に使用します。VT_USER_ENTITY1_MAPの様々な属性の使用方法を、次の表で説明します。

属性 説明

MAP_ID

表の主キーで、エンティティ関係のインスタンスを一意に識別します。

ENTITY_ID

親エンティティのエンティティID。

MAP_OBJ_ID

リンクされたエンティティのエンティティID。

DEF_MAP_ID

エンティティ関係の定義に対する一意の識別子。


5.3.2 メタデータ

VT_ENT_DEFS_MAPは、エンティティ関係の定義の格納に使用します。VT_ENT_DEFS_MAPの様々な属性の使用方法を、次の表で説明します。

属性 説明

MAP_ID

表の主キーで、エンティティ関係の定義を一意に識別します。

ENTITY_DEF_ID_1

親エンティティ・タイプのエンティティ定義ID。

ENTITY_DEF_ID_2

リンクされたエンティティ・タイプのエンティティ定義ID。


5.3.3 レコードの失効

OAAMでは、期限切れのレコードは削除されません。期限切れの未使用レコードは、VT_ENTITY_ONE表とVT_ENTITY_ONE_PROFILE表に格納されます。

  • VT_ENTITY_ONE表に格納されたエンティティ・インスタンスは、expiry timeという属性を持っています。エンティティ・インスタンス・オブジェクトの作成中、expiry timeは構成可能な値に設定されています。そのエンティティ・インスタンスに対して更新操作が発生すると、expiry timeが変更されます。現在時間がexpiry timeを超えたときには、対応するレコードも必ず失効します。

  • エンティティ・インスタンスの属性値は、表VT_ENTITY_ONE_PROFILEに保存されます。プロファイル・データも、VT_ENTITY_ONE表のエンティティ・オブジェクトと同じ失効ロジックに従います。ただし、更新操作中に、新規のプロファイル・データを持つ新規レコードが表に追加され、前のレコードは期限切れになります。

5.3.4 トランザクションとエンティティのマッピング

エンティティがインスタンスとしてトランザクションに追加されると、OAAMでは、そのアソシエーションがVT_TRX_ENT_DEFS_MAPに格納されます。このエンティティは、他のエンティティにリンクされたエンティティ用に拡張できます。たとえば、エンティティCustomerHome Addressというリレーション・タイプを持つ別のエンティティAddressとのアソシエーション/リンクがある場合、Customerエンティティがトランザクション定義に追加されると、OAAMでは、2つのレコードをVT_TRX_ENT_MAPに格納できます。1つはエンティティCustomerのレコード、もう1つはCustomerによって参照されるAddressのレコードです。内部/ネストされた/子エンティティCustomer.HomeAddressには、relation_typeとしてCustomer$HomeAddressを持つトランザクション定義の参照が設定されています。これは、TransactionCustomerエンティティ間のrelation_typedollar($)記号、およびCustomerエンティティとAddressエンティティ間のrelation_typeを連結して導出されます。

5.3.5 トランザクション作成/更新へのエンティティ関係の格納

トランザクション・インスタンスの作成中、トランザクション関連のエンティティの関係情報はデータベースに永続化されます。

トランザクション・データが作成されると、次の更新が発生します。

  1. 最上位レベル/直接リンクされたエンティティが判別されます。

  2. 最上位レベル/直接リンクされたエンティティごとに、次の手順が実行されます。

    1. VT_ENT_DEFS_MAP(定義アソシエーション)およびVT_USER_ENTITY1_MAP(データ・アソシエーション)に問い合せることにより、このエンティティに関連付けられているネスト/連鎖エンティティを判別します。

    2. ネスト/連鎖エンティティごとに、次の処理を行います。

      VT_TRX_ENT_MAPで、トランザクション・アソシエーション・マップを検索します。

      トランザクション定義IDとエンティティ定義IDを使用して、VT_TRX_ENT_MAPからマッピング情報を取得します。注意: このプロセスは、トランザクションに直接関連付けられるエンティティ・インスタンスと類似しています。

      マッピング情報を使用して、エンティティ・データ(VT_ENTITY_ONEVT_ENTITY_ONE_PROFILE)を作成/検索します。

      エンティティID(VT_ENTITY_ONEから取得)および現在のトランザクションから取得したトランザクションIDを使用して、VT_ENT_TRX_MAPにレコードを作成します。

5.4 ユースケース

共通のユースケースは、次のとおりです。