1.给编码和名称添加唯一性校验,首先要在如下目录新建rule类,实现nc.impl.pubapp.pattern.rule.IRule接口,重写process方法,接口的范型为对应的aggVO类(主子表),具体代码如下:
public class CodeUniqueCheck implements IRule<AggStressTestPlanVO> {
@Override
public void process(AggStressTestPlanVO[] vos) {
if (null == vos || 0 == vos.length) {
return;
}
StressTestPlanVO parentVO = vos[0].getParentVO();
StressTestPlanVO[] tempVos = {parentVO};
StressTestPlanVO[] vosadd = null;
if(null != parentVO){
vosadd = this.convertArrayType(tempVos);
this.checkDBUnique(vosadd);
}
StressTestPlanVO[] vosupd = null;
if(null != parentVO){
vosupd = this.convertArrayType(tempVos);
this.checkDBUnique(vosupd);
}
}
private StressTestPlanVO[] convertArrayType(Object[] vos) {
StressTestPlanVO[] smartVOs = (StressTestPlanVO[]) Array.newInstance(StressTestPlanVO.class, vos.length);
System.arraycopy(vos, 0, smartVOs, 0, vos.length);
return smartVOs;
}
public void checkDBUnique(StressTestPlanVO[] vos) {
if (null == vos && 0 == vos.length) {
return;
}
for(int i = 0;i < vos.length;i++){
StressTestPlanVO[] dbvo = new VOQuery<StressTestPlanVO>(StressTestPlanVO.class).query(new String[] { vos[i].getPrimaryKey() });
this.doLock(dbvo);
IRowSet codeRowSet = new DataAccessUtils().query(this.getCheckSql(dbvo[0].getTableName(),"code",dbvo[0].getCode()));
IRowSet nameRowSet = new DataAccessUtils().query(this.getCheckSql(dbvo[0].getTableName(),"name",dbvo[0].getName()));
if(codeRowSet.size() >1 && nameRowSet.size() > 1){
ExceptionUtils.wrappBusinessException("保存失败,当前压力测试方案编码和名称都已经存在,不可重复添加 !");
}
if (codeRowSet.size() > 1) {
ExceptionUtils.wrappBusinessException("保存失败,当前压力测试方案编码已经存在,不可重复添加 !");
}
if (nameRowSet.size() > 1) {
ExceptionUtils.wrappBusinessException("保存失败,当前压力测试方案名称已经存在,不可重复添加 !");
}
}
}
private void doLock(StressTestPlanVO[] dbvo) {
List<String> lockobj = new ArrayList<String>();
for (int i = 0; i < dbvo.length; i++) {
lockobj.add("#code_name#");
}
LockOperator lock = new LockOperator();
lock.lock(lockobj.toArray(new String[lockobj.size()]), "当前单据记录有其他用户在操作,请稍候刷新后再操作 !");
}
/**
* 拼接唯一性校验的sql
*
* @param vo
* @return
*/
private String getCheckSql(String tableName,String columnName,String columnValue) {
StringBuffer sql = new StringBuffer();
sql.append("select 1 from ");
sql.append(tableName);
sql.append(" where isnull(dr,0) = 0 ");
sql.append(" and "+ columnName +"= '" + columnValue + "' ");
return sql.toString();
}
2.然后修改对应的插入和更新类中的新增后规则即可。
/**
* 新增后规则
*
* @param processor
*/
private void addAfterRule(AroundProcesser<AggStressTestPlanVO> processor) {
// TODO 新增后规则
IRule<AggStressTestPlanVO> rule = null;
rule = new CodeUniqueCheck();
processor.addAfterFinalRule(rule);
}