OAF_EO系列2 - Validation数据校验验证机制(概念)
2014-06-12 Created By BaoXinjian
一、摘要
1. 在Update数据之前,我们往往要对待更新的记录进行有效性的校验,校验级别包括
- Attribute Level Validation: 字段级的校验
- Entity Level Validation: 记录级的校验
2. 字段级校验-只涉及单个字段的校验
字段级别的校验一般情况下写在EO的set<Attribute name>()方法中,
根据传入的value来决定是执行setAttributeInternal() 还是throw Exception.(代码应写在setAttributeInternal()之前)
例如如果一个订单的状态为CLOSE, 则不允许更改OrderPrice. 伪码如下:
Public void validateEntity()
{
super.validateEntity();
String status = getOrderStatus();
If (“CLOSE”.equals(status))
{
Number ldorderprice = (Number)getPostedAttribute(ORDERPRICE);
Number neworderprice = (Number)getOrderPrice();
If (oldorderprice.compareto(neworderprice)!=0)
{
throw new Exception(“Error: Order Price can not be edited!”);
}
}
}
3. 记录级校验-只涉及多个字段组合的校验
当校验涉及多个Attribute时,你就不能使用字段级的校验了,需使用记录级的校验,即Entity Level Validation. 此校验在validateEntity()方法中实现.
校验代码须写在 super.validateEntity() 之后
例如如果一个订单的状态为CLOSE, 则不允许更改OrderPrice. 伪码如下:
Public void validateEntity()
{
super.validateEntity();
String status = getOrderStatus();
If (“CLOSE”.equals(status))
{
Number ldorderprice = (Number)getPostedAttribute(ORDERPRICE);
Number neworderprice = (Number)getOrderPrice();
If (oldorderprice.compareto(neworderprice)!=0)
{
throw new Exception(“Error: Order Price can not be edited!”);
}
}
}
二、字段级校验案例
案例. 在EO的字段添加异常,如果Total为0值,则抛出异常
1. 字段级验证异常调用
2. 字段级验证异常测试
三、记录级校验案例
案例. 在EO的记录级validateEntity()添加异常,将多个字段组合进行判断,则抛出异常
1. 记录级验证异常调用
2. 记录级验证异常调用测试
四、异常触发后如何对transaction进行rollback
不要试图在EO的Validation 里执行rollback() 方法或clearcache() 方法. 当出现校验失败时,有下面两种做法:
Bad Method:
- 在EO Module
public void validateEntity(){
….
transaction.rollback()
throw new OAException….
}
Right Method:
- In EO Module
public void validateEntity(){
throw new OAException…
}
- In AM Module
Try
{ transaction.commit();
}Catch ( OAException ex)
{transaction.rollback();}
Thanks and Regards
参考:Tony Liu - http://blog.itpub.net/10359218/viewspace-677447/
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?