| Oracle® Fusion MiddlewareOracle Adaptive Access Manager開発者ガイド 11gリリース2 (11.1.2.3.0) E67356-01 |
|
![]() 前 |
![]() 次 |
エンティティは、トランザクションのインスタンスとして関連付けることができるデータ構造です。ユーザーが正常にログインした後に実行するすべてのプロセスをトランザクションと呼ぶことができます。Oracle Adaptive Access Managerでは、不正および誤用を防ぐために、トランザクションに関連するリスクをリアルタイムで評価できます。
この章では、アプリケーションでエンティティAPIを使用してエンティティの作成、更新および検索を実行する方法について説明します。この付録の内容は、次のとおりです。
OAAMには、不正検出を促進するエンティティとエンティティ関係をアプリケーションで管理するための2つのエンティティAPIが用意されています。
エンティティAPIは、アプリケーションでデータベース内のエンティティに対する作成、更新、置換および検索の各操作を実行することを可能にします。エンティティAPIによって、次の操作が実行できます。
OAAMデータベース・スキーマでエンティティを作成および更新する。
エンティティ属性を置換またはマージする。
エンティティの検索
データベース内のクライアントのトランザクション・データに対して実行されるエンティティ・タスクは、次の情報を必要とします。
エンティティ・キーは、OAAM管理でエンティティ定義を作成する際に管理者が指定するキーです。
エンティティ・データは、クライアント・アプリケーションのユーザーが入力するデータです。
リンクされたエンティティ関係名は、OAAM管理でエンティティ定義を作成する際に管理者が指定する名前です。リンクされたエンティティ関係名は、複雑なエンティティ・インスタンスでのみ必要です。
VCryptObjectResponseには、処理のステータスに関する情報が含まれています。
エンティティの作成と更新APIの戻り型: VCryptObjectResponse:
| 結果 | 説明 |
|---|---|
| SUCCESS | SUCCESS: APIの実行が成功し(データベース・エラーまたは接続エラーがありません)、少なくとも1つのエンティティが作成されます。
|
| ERROR | エンティティが作成されなかった場合は、ERRORになります。
|
エンティティ検索APIの戻り型: VCryptObjectResponse
| 戻りオブジェクト | 説明 |
|---|---|
| VCryptObjectResponse | SUCCESS時のエンティティ・オブジェクトであるEntityHeaderオブジェクト、またはERROR時のエラー・メッセージが含まれています。 |
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 Adaptive Access Manager Java APIリファレンスを参照してください。 |
| isReplaceEntity | エンティティの更新時に属性の置換またはマージを判別するためのフラグ。デフォルト値: FALSE(マージを指定)。 |
| commitBatchSize | 同時にコミットする必要のあるエンティティの数を判別します。デフォルトおよび最小値は1です。 |
| requestId | セッションを識別する値。この値はクライアントによって送信されます。クライアントでこの値が設定されていない場合は、ダミーの数値が生成されます。 |
この項では、不正検出におけるエンティティ解決に使用されるマッピング属性について説明します。
OAAMは、エンティティ・データ・マップを使用してエンティティを作成します。これには、属性名のキーと値のペアと、ユーザーが指定したその値が含まれています。たとえば、タイプCustomerのエンティティを作成する場合、次のようなデータ・マップが考えられます。
エンティティ・データ・マップ:
| キー: 名 | 値: Mark |
|---|---|
| キー: 姓 | 値: Smith |
| キー: 電子メール | 値: x@y.com |
| キー: shipping.addr_line1 | 値: #1, Lex Residence |
| キー: shipping.addr_line2 | 値: Redmond Street |
| キー: shipping.zip | 値: 418001 |
| キー: shipping.phone_number | 値: 6035550100 |
複雑なエンティティには、他のエンティティが関係名によってリンクされています。たとえば、Customerは、後続の例に示す属性によって定義できます。その他のエンティティは、関係名によってリンクされています。
複雑なエンティティを作成するためのデータを受信するには、エンティティ・データ・マップのキーでドット規則を使用します。データ・マップのリンクされたエンティティの属性名の前に、関係名とドット(.)を1つ付ける必要があります。
例:
エンティティそのものをエンティティの属性にできます。そのような属性はリンクされたエンティティと呼ばれます。たとえば、Shipping addressはエンティティCustomerのリンクされたエンティティです。
Customer: first name (Simple attribute)
last name (Simple attribute)
phone (Simple attribute)
email (Simple attribute)
shipping address: addr_line1
: addr_line2
: city
: state
: country
: mobile
: zip
billing address : addr_line1
: addr_line2
: city
: state
: country
: mobile
: zip
単純なエンティティとは、その他のエンティティにリンクされていないエンティティのことです。エンティティ・インスタンスを作成すると、エンティティ関連データがデータベースに格納されます。
EntityDataオブジェクトは、次のパラメータを取ります。
エンティティ名: エンティティ名によって、作成されるエンティティのタイプが判別されます。たとえば、Customerがあります。このエンティティ・タイプの定義は、エンティティ作成用のデータベースにすでに存在します。
エンティティ・データ・マップ: エンティティ・データ・マップには、属性名のキーと値のペアと、ユーザーによって指定された値が含まれています。関連するエンティティを持たない単純なエンティティを作成するには、次のようにentityDataMapを移入します。
| キー | 値 |
|---|---|
キー: attributeName1 |
値: attributeValue1 |
キー: attributeName2 |
値: attributeValue2 |
キー: attributeName3 |
値: attributeValue3 |
たとえば、関連するエンティティを持たないCustomerエンティティを作成します。
| コンテキスト・データ | 値 |
|---|---|
| キー: 名 | 値: Mark |
| キー: 姓 | 値: Smith |
| キー: 電子メール | 値: x@y.com |
| キー: 携帯電話 | 値: 6035550100 |
単純なエンティティ・インスタンスを作成するには、次の手順を実行します。
エンティティ・データが含まれているマップを作成します。
マップのキーはエンティティの属性名(OAAM管理で指定したもの)、マップの値はユーザー入力値です。
後続の例では、Customerエンティティ・データのデータが表示され、ユーザー入力としてMark Smithという名前が表示されています。Customerエンティティには、属性としてfirst nameおよびlast nameが設定されています。
Map<String,String> entityDataMap = new HashMap<String,String>();
entityDataMap.put("first name","Mark");
entityDataMap.put("last name","Smith");
エンティティ・データ・マップとエンティティ・タイプをカプセル化しているEntityDataオブジェクトを作成します。たとえば、Customerがあります。
EntityData entityData= new EntityData("Customer",entityDataMap);
このAPIはEntityDataの配列のみを受け入れるため、配列を作成し、作成されたentitydataをその中に挿入します。
EntityData[] entityRequestData= new EntityData[1]; entityRequestData[0]= entityData;
最後に、API trackerをコールします。これはVCryptTrackerインスタンスです。
response = tracker.createOrUpdateEntities(entityRequestData, true, commitBatchSize,requestId);
エンティティ・インスタンスを次の方法で作成しようとすると、エラーが発生します。
存在していないエンティティを使用した場合。
エンティティ名としてNULLを使用した場合。
必須情報を指定しなかった場合。
必須情報としてNULL値を使用した場合。
一致しないエンティティのデータ型を使用した場合。
エンティティ定義と比較してまったく異なるエンティティ・データを使用した場合。
既存エンティティの属性を更新するには、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つの方法があります。
たとえば、次のようになります。
Customer (101): firstname -> Mark
lastname -> Smith
mobile -> 0987654321
email -> x@y.com
前述の例では、エンティティID101を持つタイプCustomerのエンティティが使用されています。その電子メールをa@b.comに変更する場合、エンティティ・データを渡すための2つの方法があります。
最初の方法は、次のとおりです。
$id$ -> 101
email -> a@b.com
2つ目の方法は、次のとおりです。
firstname -> Mark
lastname -> Smith
email -> a@b.com
entityIdを使用して既存エンティティの属性値を削除するには、次のようにentityDataMapを移入し、isReplaceEntity (createOrUpdateEntityにある)パラメータをtrueに設定します。
entityDataMap:
| キー: $id$ | 値: EntityId |
|---|---|
キー: attributeName1 |
値: |
キー: attributeName2 |
値: |
たとえば、entityIdとして101を持つCustomerエンティティの電子メールIDを削除します。
| キー: $id$ | 値: 101 |
|---|---|
| キー: 電子メール |
最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティを持つエンティティを作成するには、次のフォーマットを使用します。
entityDataMap:
キー: attributeName1 |
値: attributeValue1 |
|---|---|
キー: attributeName2 |
値: attributeValue2 |
キー: attributeName3 |
値: attributeValue3 |
キー: relationshipName1.attributeName1 |
値: linkedEnt1AttributeValue1 |
キー: relationshipName1.attributeName2 |
値: linkedEnt1AttributeValue2 |
キー: relationshipName2.attributeName1 |
値: linkedEnt2AttributeValue1 |
出荷先は、Customerをaddressタイプの別のエンティティにリンクする関係名です。複雑なエンティティを作成するためのデータを受信するには、エンティティ・データ・マップのキーでドット規則を使用します。データ・マップのリンクされたエンティティの属性名の前に、関係名とドット(.)を1つ付ける必要があります。
例: 出荷先および請求先のrelationshipNamesを持つ、リンクされた住所エンティティが含まれているCustomerエンティティを作成します。
| キー: 名 | 値: Mark |
|---|---|
| キー: 姓 | 値: Smith |
| キー: 電子メール | 値: x@y.com |
| キー: shipping.addr_line1 | 値: #1, Lex Residence |
| キー: shipping.addr_line2 | 値: Redmond Street |
| キー: billing.addr_line1 | 値: #2, Lex Residence |
最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティ(単一の関係の複数のインスタンスを含む)を持つエンティティを作成するには、createOrUpdateEntities() APIを使用します。
entityDataMap:
キー: attributeName1 |
値: attributeValue1 |
|---|---|
キー: attributeName2 |
値: atributeValue2 |
キー: 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 |
|---|---|
| キー: 姓 | 値: Smith |
| キー: 電子メール | 値: 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 |
最上位レベルのエンティティと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 |
|---|---|
| キー: 姓 | 値: Smith |
| キー: 電子メール | 値: 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値を指定した場合。
一致しないリンクされたエンティティ・データのデータ型を使用した場合。
エンティティ定義と比較してまったく異なるリンクされたエンティティ・データを使用した場合。
リンクされたエンティティのタイプが親と同じ場合。
リンクされたエンティティ(マルチレベル)のタイプが親と同じである複雑なエンティティ・インスタンスを作成した場合、そのエンティティ・インスタンスはエラー・ステータス付きで作成されます。このような定義は許可されていないため、エンティティ定義の不一致によってエラーが発生します。
関連エンティティのエンティティIDを持つエンティティの関連エンティティを更新するには、次のようにします。
entityDataMap:
キー: attributeName1 |
値: attributeValue1 |
|---|---|
キー: attributeName2 |
値: attributeValue2 |
キー: relationshipName1.$id$ |
値: linkedEnt1EntityId |
キー: relationshipName1.attributeName1 |
値: linkedEnt1AttributeValue1 |
注意: 親エンティティの属性のかわりに、親のentityIdを渡すこともできます。
例: カスタマMark Smithの請求先住所の都市をChicagoに更新します。この請求先住所は、103のentityIdですでに存在しています。
| キー: 名 | 値: Mark |
|---|---|
| キー: 姓 | 値: Smith |
| キー: billing.$id$ | 値: 103 |
| キー: billing.city | 値: Chicago |
1つ以上の関連エンティティを親エンティティからリンク解除できます。
Customer: first name:: abc
: last name:: xyz
: mobile:: 6035550100
: email:: p@q.com
: shipping address:: (entity with id = 102)
: shipping address:: (entity with id = 105)
: billing address:: (entity with 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","Smith"+timeStamp);
entityDataMap.put("email","x@y.com");
entityDataMap.put("mobile","6035550100");
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","6035550100");
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","6035550100");
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);
}
Search APIを使用して、エンティティIDまたはキー・エンティティ属性の値に基づくエンティティの検索を行います。必須パラメータは、エンティティ名とエンティティ・データ・マップです。エンティティ名はエンティティ・タイプに対応し、エンティティ・データ・マップにはエンティティID、または属性名のキー/値のペアと検索対象のエンティティの値が含まれています。エンティティIDの場合、エンティティ・データ・マップは次のように指定されます。
entityDataMap:
| キー | 値 |
|---|---|
| $id$ | 107 |
この例では、107が検索対象のエンティティのエンティティIDです。
APIコール
検索対象のエンティティのエンティティ・データが含まれているマップを作成します。
マップのキーはエンティティの属性名(OAAM管理で指定したもの)、マップの値はユーザー入力値です。
後続の例では、Customerエンティティ・データのデータが表示され、ユーザー入力としてMark Smithという名前が表示されています。Customerエンティティには、属性としてfirst nameおよびlast nameが設定されています。
Map<String,String> entityDataMap = new HashMap<String,String>();
entityDataMap.put("first name","Mark");
entityDataMap.put("last name","Smith");
エンティティ・データ・マップとエンティティ・タイプをカプセル化しているEntityDataオブジェクトを作成します。たとえば、Customerがあります。
EntityData entityData= new EntityData("Customer",entityDataMap);
最後に、API trackerをコールします。これはVCryptTrackerインスタンスです。
response =tracker.searchEntityByKey(entityData);
トランザクション・インスタンスの作成中、トランザクション関連のエンティティの関係情報はデータベースに永続化されます。
VT_USER_ENTITY1_MAPは、エンティティ関係に関する情報を格納します。次の表で、VT_USER_ENTITY1_MAPのそれぞれの属性の使用方法について説明します。
| 属性 | 説明 |
|---|---|
| MAP_ID | 表の主キーで、エンティティ関係のインスタンスを一意に識別します。 |
| ENTITY_ID | 親エンティティのエンティティID。 |
| MAP_OBJ_ID | リンクされたエンティティのエンティティID。 |
| DEF_MAP_ID | エンティティ関係の定義に対する一意の識別子。 |
VT_ENT_DEFS_MAPは、エンティティ関係の定義を格納します。次の表で、VT_ENT_DEFS_MAPのそれぞれの属性の使用方法について説明します。
| 属性 | 説明 |
|---|---|
| MAP_ID。 | 表の主キーで、エンティティ関係の定義を一意に識別します。 |
| ENTITY_DEF_ID_1 | 親エンティティ・タイプのエンティティ定義ID。 |
| ENTITY_DEF_ID_2 | リンクされたエンティティ・タイプのエンティティ定義ID。 |
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表のエンティティ・オブジェクトと同じ失効ロジックに従います。ただし、更新操作中に、新規のプロファイル・データを持つ新規レコードが表に追加され、前のレコードは期限切れになります。
エンティティがインスタンスとしてトランザクションに追加されると、OAAMでは、そのアソシエーションがVT_TRX_ENT_DEFS_MAPに格納されます。このエンティティは、他のエンティティにリンクされたエンティティ用に拡張できます。たとえば、エンティティCustomerにHome Addressというリレーション・タイプを持つ別のエンティティAddressとのアソシエーション/リンクがある場合、Customerエンティティがトランザクション定義に追加されると、OAAMでは、2つのレコードをVT_TRX_ENT_MAPに格納できます。1つはエンティティCustomerのレコード、もう1つはCustomerによって参照されるAddressのレコードです。内部/ネストされた/子エンティティCustomer.HomeAddressには、relation_typeとしてCustomer$HomeAddressを持つトランザクション定義の参照が設定されています。これは、TransactionとCustomerエンティティ間のrelation_type、dollar($)記号、およびCustomerエンティティとAddressエンティティ間のrelation_typeを連結して導出されます。
トランザクション・インスタンスの作成中、トランザクション関連のエンティティの関係情報はデータベースに永続化されます。
トランザクション・データが作成されると、次の更新が発生します。
最上位レベル/直接リンクされたエンティティが判別されます。
最上位レベル/直接リンクされたエンティティごとに、次の手順が実行されます。
表VT_ENT_DEFS_MAP(定義アソシエーション)およびVT_USER_ENTITY1_MAP(データ・アソシエーション)に問い合せることにより、このエンティティに関連付けられているネスト/連鎖エンティティを判別します。
ネスト/連鎖エンティティごとに、次の処理を行います。
VT_TRX_ENT_MAPで、トランザクション・アソシエーション・マップを検索します。
トランザクション定義IDとエンティティ定義IDを使用して、VT_TRX_ENT_MAPからマッピング情報を取得します。注意: このプロセスは、トランザクションに直接関連付けられるエンティティ・インスタンスと類似しています。
マッピング情報を使用して、エンティティ・データ(VT_ENTITY_ONE、VT_ENTITY_ONE_PROFILE)を作成/検索します。
エンティティID (VT_ENTITY_ONEから取得)および現在のトランザクションから取得したトランザクションIDを使用して、VT_ENT_TRX_MAPにレコードを作成します。
次に、基本的な使用例を示します。
エンティティ: プロバイダ(医師、看護婦など)、患者および住所。
管理者が不正シナリオを調査していて、プロバイダと患者が同じ住所で生活または仕事をしているかどうかを知る必要があるとします。この場合は、関係patient-address、provider-addressを作成し、対応するルールを設定する必要があります。
患者と医師が同じ場所で働いているまたは居住している場合、ビジネス・ルールが生成されます。このルールは、patient.worklocation = Physician.worklocationまたはpatient.residence = Physician.residenceの場合にtrueを返し、アラートを生成します。
医療レコード・アクセス・トランザクションには、直接関係する2つのエンティティのみが存在します。Provider IDとPatient IDです。このAPIをコールしてトランザクションを作成する際には、その他のデータは指定されません。ProvidersとPatientsは両方とも、様々なエンティティに関連しています。1つの例はhome addressで、これはaddressエンティティのインスタンスです。セッション詳細では、Provider IDとPatient IDが含まれている医療レコード・アクセス・トランザクションを示しています。