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
が含まれている医療レコード・アクセス・トランザクションを示しています。