`

ADF中做重复性验证

阅读更多

当我们给数据库中插入数据的时候,一个比较常见的需求就是进行重复性验证。
那么这个需求在ADF中如何来做呢?首先,要做重复性验证,必须先知道哪几个字段能够唯一确定一条记录。下面我举两中场景以及实现他们的方法:

A. 我需要给不同的报告(report_type_id)配置不同的的模板(template_id),那么这里我就可以通过report_type_id和template_id唯一确定一条配置记录。

对于这个需求,我们需要做以下几步:
1. 在EO配置页面的General标签页上,创建一个Alternate key,包含report_id和template_id两个字段;
2. 在EO配置页面的Business Rules标签页上,创建一个UniqueKey Validation。在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的组合也可以唯一确定一条记录。


对于这个需要,如果我们使用上面的方法,就需要建立下面的两个Alternate Key:

Name Key 1 Key 2
ReportTemplateAltKey   report_type_id     tempalte_id
EssayTemplateAltKey    essay_type_id      template_id

 
之后再按照上面的步骤分别建立两个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)

 

这个错误是因为我们定义了两个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还是会通过ReportTemplateAltKey和EssayTemplateAltKey分别去查找已经存在的数据(EO缓存中)。当使用ReportTemplateAltKey来查找数据时,显然没有问题,因为只能找到正在新增的这条数据。而当使用EssayTemplateAltKey来查找数据时,因为essay_type_id为空,所以只是通过template_id来查找了,最终导致查找出两条数据,分别是DB中已经存在的一条和新增的一条。这就违反了唯一性的约束,所以报错了。

 

对于这中场景,我们可以使用下面的方案:

1. 创建一个ExistedTemplateVVO,sql如下:

 

SELECT 
    report_type_id, 
    essay_type_id, 
    template_id
FROM TEMPLATE_CONFIG

 

 

2. 创建三个绑定变量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标签页上输入验证执行的条件((ReportTypeId != null || EssayTypeId != null) && TemplateId !=null),最后在Failure Handling标签页上输入错误提示消息。

 

对于这个需求,上面的配置就可以实现了,也不需要写代码。

分享到:
评论

相关推荐

    ADF4360_v4_1_4软件设置

    总的来说,ADF4360_v4_1_4软件是ADF4360系列芯片开发和应用过程中的得力工具,它简化了复杂的寄存器设置过程,提高了工作效率,确保了系统的稳定性和性能。对于需要进行RF频率合成器设计和调试的工程师来说,这款...

    ADF1_Repo

    6. **测试用例**:确保代码功能正确性的验证,通常包括单元测试、集成测试等。 7. **开发流程**:如敏捷开发、持续集成/持续部署(CI/CD)等,影响代码仓库的组织结构和工作流程。 为了更详细地了解ADF1_Repo,我们...

    adf-adb-cicd-demo:用于Data Factory和Databricks的Azure DevOps yaml管道的示例

    通过使用YAML文件,你可以明确地指定构建步骤、触发器、依赖项和其他配置,确保整个流程的可重复性和一致性。YAML管道允许你灵活地构建自定义的工作流,并易于集成到自动化测试和部署策略中。 **CI/CD流程** 在"adf...

    季节性序列,季节性序列建模流程,matlab

    3. **平稳性检验**:为了进行有效的建模,通常需要对序列进行平稳性检验,如ADF(Augmented Dickey-Fuller)检验。如果序列是非平稳的,可能需要进行差分操作,使其转化为平稳序列。 4. **模型选择**:ARMA(自回归...

    ADFutils

    在实际项目中,使用这样的工具类可以帮助开发者遵循DRY(Don't Repeat Yourself)原则,减少重复代码,提高代码的可读性和可维护性。同时,通过封装常用操作,可以降低学习曲线,让开发者更专注于业务逻辑,而不是...

    关闭AM Pool的测试代码

    在Oracle Application Development Framework (ADF) 中,ApplicationModule (AM) 池是一种管理应用程序模块实例的机制,用于提高性能和减少资源消耗。然而,在开发和调试阶段,有时我们需要关闭AM Pool来更好地理解...

    时间序列及spss教程

    季节性是由于一年中某些时间段的自然规律导致的重复模式;循环是比季节性更长的周期性波动;而随机性则反映了无法解释的波动。 在SPSS中,进行时间序列分析通常包含以下几个步骤: 1. **数据准备**:确保数据按照...

    太阳黑子时间序列模型

    然后,运用单位根检验(ADF检验)验证差分后数据的平稳性,结果显示数据无单位根,满足建模条件。 在模型建立完成后,通常会进行参数估计和模型诊断,如残差分析,确保模型的合理性。最终,模型用于预测未来的太阳...

    时间序列分析模型构建与MATLAB实现 (1).zip

    2. **季节性分析**:如果数据在固定的时间间隔(如季度、月份或星期)上呈现出重复的模式,就存在季节性。MATLAB提供函数如`seasonaldecompose`用于分解季节性成分。 3. **循环分析**:周期性是指数据在不固定但可...

    基于机器学习和深度学习的长短时量化交易算法.zip

    4. **Understand_Data.ipynb**(重复的文件名,可能是个错误或重复的步骤):同上,进一步的数据理解可能包括时间序列分析,如周期性、趋势和季节性分析。 5. **Train_Validate_Test.ipynb**:这是模型训练的关键...

    时间序列分析[美] pdf

    - **平稳性检验**:使用ADF检验等方法验证数据是否平稳。 - **差分**:通过差分操作去除趋势或季节性成分。 ### 预测评估 在构建完预测模型后,还需要对模型的预测性能进行评估。常用的评估指标包括: - **均方...

    时间序列分析.zip

    4. **平稳性检验**:使用ADF(Augmented Dickey-Fuller)检验判断数据是否为平稳时间序列。如果不平稳,可能需要进行差分或对数变换。 5. **特征工程**:提取如星期几、月份等时间特征,这些可能影响事故的发生。 ...

    stata在统计与计量中的运用 实证分析处理 统计计量分析 数据分析 stata软件meta分析操作详细攻略 共38页.pptx

    - **平稳性检验**:使用ADF等测试方法判断时间序列是否平稳。 - **ARIMA模型**:构建自回归移动平均模型预测未来趋势。 - **VAR模型**:分析多个时间序列之间的相互关系。 #### 9. 面板数据分析 - **固定效应模型*...

    arima的matlab代码-ARIMA-And-Seasonal-ARIMA:ARIMA-And-Seasonal-ARIMA

    当数据包含明显的季节性模式时,我们需要引入季节性ARIMA(Seasonal ARIMA,简称SARIMA),该模型在ARIMA的基础上增加了季节性参数,以捕捉每年、每季度或每月等固定周期内的重复模式。 在MATLAB中,执行以下步骤...

    联想9215 9218维修资料

    11. **作业重复键**:此键用于再次打印先前存储在多功能一体机内存中的任意一个作业,方便用户重复执行相同的任务。 12. **进纸错误指示灯**:当复印机发生进纸错误时,此灯会亮起,提示用户处理纸张问题。 13. **...

    timeseries:时间序列分析的数学建模

    - **平稳性检验**:通过ADF(Augmented Dickey-Fuller)检验判断是否需要差分。 - **模型选择**:根据数据特性选择合适的模型。 - **模型估计与验证**:利用最大似然估计或最小二乘法估计参数,用交叉验证或残差...

    时间序列分析结课论文-平安银行股市收盘价的时序模型研究

    为了验证差分后的数据是否满足平稳性要求,文中使用了ADF检验方法。根据检验结果,统计量小于三个置信度的统计值,且p值接近0,表明有99%的把握拒绝原假设,即数据满足平稳性要求。此外,还进行了白噪声检验,检验...

    OracleEBS开发汇总文档

    - **应用场景**: 控制数据验证逻辑和提交行为。 6. **创建FORMS数据块的主从关系** - **方法**: 在Form Designer中通过主从关系建立数据块间的联系。 - **应用场景**: 确保数据的一致性和完整性。 7. **FORMS...

Global site tag (gtag.js) - Google Analytics