当我们给数据库中插入数据的时候,一个比较常见的需求就是进行重复性验证。
那么这个需求在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系列芯片开发和应用过程中的得力工具,它简化了复杂的寄存器设置过程,提高了工作效率,确保了系统的稳定性和性能。对于需要进行RF频率合成器设计和调试的工程师来说,这款...
6. **测试用例**:确保代码功能正确性的验证,通常包括单元测试、集成测试等。 7. **开发流程**:如敏捷开发、持续集成/持续部署(CI/CD)等,影响代码仓库的组织结构和工作流程。 为了更详细地了解ADF1_Repo,我们...
通过使用YAML文件,你可以明确地指定构建步骤、触发器、依赖项和其他配置,确保整个流程的可重复性和一致性。YAML管道允许你灵活地构建自定义的工作流,并易于集成到自动化测试和部署策略中。 **CI/CD流程** 在"adf...
3. **平稳性检验**:为了进行有效的建模,通常需要对序列进行平稳性检验,如ADF(Augmented Dickey-Fuller)检验。如果序列是非平稳的,可能需要进行差分操作,使其转化为平稳序列。 4. **模型选择**:ARMA(自回归...
在实际项目中,使用这样的工具类可以帮助开发者遵循DRY(Don't Repeat Yourself)原则,减少重复代码,提高代码的可读性和可维护性。同时,通过封装常用操作,可以降低学习曲线,让开发者更专注于业务逻辑,而不是...
在Oracle Application Development Framework (ADF) 中,ApplicationModule (AM) 池是一种管理应用程序模块实例的机制,用于提高性能和减少资源消耗。然而,在开发和调试阶段,有时我们需要关闭AM Pool来更好地理解...
季节性是由于一年中某些时间段的自然规律导致的重复模式;循环是比季节性更长的周期性波动;而随机性则反映了无法解释的波动。 在SPSS中,进行时间序列分析通常包含以下几个步骤: 1. **数据准备**:确保数据按照...
然后,运用单位根检验(ADF检验)验证差分后数据的平稳性,结果显示数据无单位根,满足建模条件。 在模型建立完成后,通常会进行参数估计和模型诊断,如残差分析,确保模型的合理性。最终,模型用于预测未来的太阳...
2. **季节性分析**:如果数据在固定的时间间隔(如季度、月份或星期)上呈现出重复的模式,就存在季节性。MATLAB提供函数如`seasonaldecompose`用于分解季节性成分。 3. **循环分析**:周期性是指数据在不固定但可...
4. **Understand_Data.ipynb**(重复的文件名,可能是个错误或重复的步骤):同上,进一步的数据理解可能包括时间序列分析,如周期性、趋势和季节性分析。 5. **Train_Validate_Test.ipynb**:这是模型训练的关键...
- **平稳性检验**:使用ADF检验等方法验证数据是否平稳。 - **差分**:通过差分操作去除趋势或季节性成分。 ### 预测评估 在构建完预测模型后,还需要对模型的预测性能进行评估。常用的评估指标包括: - **均方...
4. **平稳性检验**:使用ADF(Augmented Dickey-Fuller)检验判断数据是否为平稳时间序列。如果不平稳,可能需要进行差分或对数变换。 5. **特征工程**:提取如星期几、月份等时间特征,这些可能影响事故的发生。 ...
- **平稳性检验**:使用ADF等测试方法判断时间序列是否平稳。 - **ARIMA模型**:构建自回归移动平均模型预测未来趋势。 - **VAR模型**:分析多个时间序列之间的相互关系。 #### 9. 面板数据分析 - **固定效应模型*...
当数据包含明显的季节性模式时,我们需要引入季节性ARIMA(Seasonal ARIMA,简称SARIMA),该模型在ARIMA的基础上增加了季节性参数,以捕捉每年、每季度或每月等固定周期内的重复模式。 在MATLAB中,执行以下步骤...
11. **作业重复键**:此键用于再次打印先前存储在多功能一体机内存中的任意一个作业,方便用户重复执行相同的任务。 12. **进纸错误指示灯**:当复印机发生进纸错误时,此灯会亮起,提示用户处理纸张问题。 13. **...
- **平稳性检验**:通过ADF(Augmented Dickey-Fuller)检验判断是否需要差分。 - **模型选择**:根据数据特性选择合适的模型。 - **模型估计与验证**:利用最大似然估计或最小二乘法估计参数,用交叉验证或残差...
为了验证差分后的数据是否满足平稳性要求,文中使用了ADF检验方法。根据检验结果,统计量小于三个置信度的统计值,且p值接近0,表明有99%的把握拒绝原假设,即数据满足平稳性要求。此外,还进行了白噪声检验,检验...
- **应用场景**: 控制数据验证逻辑和提交行为。 6. **创建FORMS数据块的主从关系** - **方法**: 在Form Designer中通过主从关系建立数据块间的联系。 - **应用场景**: 确保数据的一致性和完整性。 7. **FORMS...