ADFでの繰返し検証

4508 ワード

データベースにデータを挿入する場合、反復的な検証が一般的です.では、このニーズはADFでどのようにしているのでしょうか.まず、重複検証を行うには、どのフィールドがレコードを一意に決定できるかを知る必要があります.次に、2つのシーンと彼らを実現する方法を挙げます.A.私は異なるレポート(report_type_id)に異なるテンプレート(template_id)を構成する必要があります.では、ここではreport_idを通じてtype_idとtemplate_idは、構成レコードを一意に決定します.このニーズに対して、私たちは以下のステップを行う必要があります:1.EO構成ページのGeneralタブページで、report_を含むAlternate keyを作成します.idとtemplate_idの2つのフィールド;2.EO構成ページのBusiness Rulesタブページで、UniqueKeyValidationを作成します.Rule Definitionラベル・ページで最初に作成したAlternate keyを選択し、Validation Executionラベル・ページに検証実行の条件(ReportTypeId!=null&&TemplateId!=null)を入力し、最後にFailure Handlingラベル・ページにエラー・メッセージを入力します.このニーズに対して、上の構成は実現でき、コードを書く必要はありません.B.異なるレポート(report_type_id)に異なるテンプレート(template_id)を構成する必要があります.また、異なる論文(essay_type_id)に異なるテンプレート(template_id)を構成する必要があります.ではここでreport_type_idとtemplate_idの組合せは、レコードを一意に決定することができ、essay_type_idとtemplate_idの組合せは、1つのレコードを一意に決定することもできる.
このニーズに対して、上記の方法を使用すると、次の2つのAlternate Keyを構築する必要があります.
Name
Key 1
Key 2
ReportTemplateAltKey  
report_type_id    
tempalte_id
EssayTemplateAltKey   
essay_type_id     
template_id
その後、上記の手順に従って2つのUniqueKey Validationをそれぞれ確立し、実行条件はそれぞれ
検証ルール
ルール実行条件の検証
ReportTemplateAltKeyValidation  
ReportTypeId != null && TemplateId !=null    
EssayTemplateAltKeyValidation    
EssayTypeId != null && TemplateId != null
これですべてOKのようですが、記録を増やそうとすると次のエラーに遭遇します.
oracle.jbo.TooManyObjectsException: JBO-25013: Too many objects match the primary key null.
	at oracle.jbo.server.OracleSQLBuilderImpl.doEntitySelectForAltKey(OracleSQLBuilderImpl.java:931)
	at oracle.jbo.server.EntityImpl.doSelectForAltKey(EntityImpl.java:8280)
	at oracle.jbo.server.EntityImpl.populate(EntityImpl.java:6937)
	at oracle.jbo.server.EntityDefImpl.createRowFromDatabase(EntityDefImpl.java:1569)
	at oracle.jbo.server.EntityDefImpl.findFromDatabase(EntityDefImpl.java:1589)
	at oracle.jbo.server.EntityCache.addForAltKey(EntityCache.java:974)
	at oracle.jbo.server.EntityCache.add(EntityCache.java:533)
	at oracle.jbo.server.ViewRowStorage.entityCacheAdd(ViewRowStorage.java:3146)
	at oracle.jbo.server.ViewRowImpl.entityCacheAdd(ViewRowImpl.java:3666)
	at oracle.jbo.server.QueryCollection.add(QueryCollection.java:2376)
	at oracle.jbo.server.ViewRowSetImpl.insertRowAtInternal(ViewRowSetImpl.java:2266)
	at oracle.jbo.server.ViewRowSetImpl.insertViewRowAt(ViewRowSetImpl.java:2226)
	at oracle.jbo.server.ViewRowSetIteratorImpl.doInsertRow(ViewRowSetIteratorImpl.java:2376)
	at oracle.jbo.server.ViewRowSetIteratorImpl.insertRow(ViewRowSetIteratorImpl.java:2333)
	at oracle.jbo.server.ViewRowSetImpl.insertRow(ViewRowSetImpl.java:3126)
	at oracle.jbo.server.ViewObjectImpl.insertRow(ViewObjectImpl.java:10882)

 
このエラーは、2つのAlternate Keyを定義したためです.データベースに次のデータがある場合:
report_type_id 
essay_type_id  
template_id
null 
1
1
 
次のような新しいデータを挿入しようとしたとき:
report_type_id 
essay_type_id  
template_id
1
null
1
 
このときReportTemplateAltKeyValidationのみがトリガーされ、EssayTemplateAltKeyValidationはトリガーされませんが、ADFはReportTemplateAltKeyyとEssayTemplateAltKeyyでそれぞれ既存のデータ(EOキャッシュ中)を検索します.ReportTemplateAltKeyを使用してデータを検索する場合は、新しいデータしか見つからないため、問題はありません.EssayTemplateAltKeyを使用してデータを検索する場合、essay_type_idは空なのでtemplate_を通過するだけですidが検索され,最終的にはDBに既に存在する1つと新規の1つの2つのデータが検索される.これは唯一性の制約に違反しているので、報告を間違えた.
 
このシーンでは、次のシナリオを使用できます.
1.次のようなExistedTemplateVVOを作成します.
 
SELECT 
    report_type_id, 
    essay_type_id, 
    template_id
FROM TEMPLATE_CONFIG

 
 
2.3つのバインド変数templateId,reportTypeId,essayTypeIdを作成する.
3.次のクエリ条件を持つExistedTemplateVVOCriteriaを作成します.
 
Group
    template_id = :templateId
And Group
    report_type_id = :reportTypeId OR
    essay_type_id = :essayTypeId

 
 
4.TemplateConfigEO構成ページのView AccessorラベルページにExistedTemplateVVOを追加し、デフォルトのクエリー条件としてExistedTemplateVVOCriteriaを使用する.
5.TemplateConfigEO構成ページのBusiness Rulesラベルページで、List Validationを作成します.Rule Definitionタブ・ページのList TypeでView Accessorを選択し(他のタイプでは現在挿入されている行の情報をフィルタ条件にできないため)、Validation Executionタブ・ページに検証実行の条件を入力します((ReportType!=null‖EssayType!=null)&&TemplateId!=null)、最後にFailure Handlingラベルページにエラーメッセージを入力します.
 
このニーズに対して、上記の構成は実現でき、コードを書く必要もありません.