问题描述:

在做基础系统的Bug调试及修改的过程中,遇到了一个很奇怪的问题:在进行记录的修改操作时,如下图所示,

理论上层次名称和备注都是可以随意修改的,但是如果我只是修改备注,对名称不做任何的改动(或者是只是点开修改的弹出框,不做任何改动),点击确定进行提交,总是弹出层次名称重复的提示,导致修改失败。

问题分析:

经过各种测试,发现问题就出在这个名称是否重复的判断逻辑上,打开代码进行查看,找到验证层次名称是否重复的代码,如下所示:

public String validateLevelName(String levelName, String dataBaseName)throws Exception {Map<Serializable, Serializable> map = new HashMap<Serializable, Serializable>();List<SchoolLevel> classlist = new ArrayList<SchoolLevel>();String result;classlist = schoolLevelBean.queryLevelNodeByName(levelName,dataBaseName<span style="font-family: Arial, Helvetica, sans-serif;"> );</span>if (classlist == null || classlist.isEmpty()) {// 无重复数据result = "0";} else {// 有重复数据result = "1";}return result;}

其调用的queryLevelNodeByName  方法如下:

<span style="font-size:18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="java">public List<SchoolLevel> queryLevelNodeByName(String condition,String dataBase) {String hql = "from SchoolLevel h where h.levelName=:levelName and h.isDelete=0";Map map = new HashMap();map.put("levelName", condition);// 调用底层 Hql查询方法return schoolLevelEao.queryByHql(hql, map, dataBase);}

从上面的代码可以看到,判断名称是否重复的方法中只是根据名称进行了查询,判断返回结果是否为空,即得出是否重复的结论,这个逻辑是不对的,为什么这么说呢?因为既然是修改操作,那么加载出来的这条记录在数据库中是存在的,然后用已经存在的名称作为参数去数据库进行查询,结果肯定能查到至少一条,而查询结果返回的数据就是页面加载出来的那条记录,以这样的逻辑去进行判断是否重复,其结果将永远是“对不起,层次名称已经存在,请返回修改!”。

怎么办呢?最开始的想法是,既然是修改那么没必要进行重复判断了,只有在添加的时候,进行重复性判断即可。可是修改代码之后,发现还是不行,上述问题是没了,又出来新的问题,出现了重复记录,因为没有进行重复性校验,名称可以肆无忌惮的重复了,回头一想这方法真是too young too simple!

后来才开始认真的寻找解决办法,其核心问题是在进行重复性校验的时候,将要修改的这条记录本身排除即可。如何排除呢?我想到的有两种思路,一种是在查询语句上进行修改,在查询条件上添加“id <> 要修改记录的id”。另一种是,在查询结果中将被修改的记录排除,如果排除提交的记录,查询结果集还有记录,那就证明和其自身除外的其他记录的名称重复了。

问题解决:

思路有了,那么就着手开始修改代码逻辑吧,先尝试了第一种办,修改查询的JPQL语句,因为对JPQL语句不怎么熟悉,虽然类似于HQL,但是还是还是有些区别,我知道第一种方法简单,但是没有去深究,最后也没成功。因此就改用第二种方法进行实现,经过了反复的测试和修改,终于是成功了,其代码如下:

public String validateLevelName(String levelName,String levelID, String dataBaseName)throws Exception {Map<Serializable, Serializable> map = new HashMap<Serializable, Serializable>();List<SchoolLevel> levelIdList = new ArrayList<SchoolLevel>();List<SchoolLevel> classlist = new ArrayList<SchoolLevel>();String result = "";//根据提交的Id进行查询levelIdList = schoolLevelBean.queryLevelIDByHql(levelID, dataBaseName);//根据提交的名称进行查询classlist = schoolLevelBean.queryLevelNameByHql(levelName,dataBaseName);//classlist:  0   1//根据Id查询的记录条数大于0是修改的重复判断逻辑,否则就是添加的判断逻辑if(levelIdList.size()>0){ //修改的判断逻辑//同一Id下,如果提交的名称和数据库查询出来的名称相同,则不重复if(levelIdList.get(0).getLevelName().equals(levelName)){result="0";}else{//如果名称做了改动,则将按名称查询的结果中的记录本身排除for(int i=0;i<classlist.size();i++){if (classlist.get(i).getId()==levelID) {classlist.remove(i);}}//判断移除其自身之后的记录条数是否为0if (classlist.size()==0) { //若为0,则不重复result = "0";} else {    //否则重复result = "1";}}}else{ //添加的判断逻辑if(classlist.size()>0){result="1";}else{result="0";}}return result;}

因为添加和修改的名称是否重复都要用这个函数,因此就将两者判断逻辑放在了一起,有些许繁琐。虽然我实现了功能效果,但是心里明白这种实现还可以再优化,并且这种绝不是最优的实现方案,希望大家有好的解决方案可以给我留言,不胜感激。

【项目问题总结】4:修改操作的重复性验证逻辑相关推荐

  1. 7.1 SAP MASS批量修改操作手册

    7 SAP MASS批量修改操作手册 事务码MASS可以对利润中心.销售订单等超过20种主数据和单据进行批量修改.MASS并不是直接维护数据表,而是调用相关事务码进行操作,当对象类型没有指定事务码时只 ...

  2. java poi读取word中附件_java用poi实现对word读取和修改操作

    java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob.poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便 ...

  3. vue修改代码同步页面_vue实现两个组件之间数据共享和修改操作

    我们在使用vue开发过程中会遇到这样的情况,在父组件中引入了子组件,需要将父组件的值传到子组件中显示,同时子组件还可以更改父组件的值. 以我目前的一个项目的开发为例,如下图页面: 在父组件中,我引入了 ...

  4. java用poi实现对word读取和修改操作

    java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob.poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便 ...

  5. vue 获取动态域名_vue项目接口域名动态获取操作

    需求: 接口域名是从外部 .json 文件里获取的. 思路: 在开始加载项目前 进行接口域名获取,然后重置 接口域名的配置项. 实现: 1.config/index.js 文件 进行基础配置 impo ...

  6. 实现对学生信息的修改操作

    返回目录:<学生信息管理系统(Java+JSP)> 本篇博客主要实现对学生信息的修改操作: 步骤1.在学生信息的显示页面(即student.jsp页面)中,在表格最后增加一列"修 ...

  7. SpringBoot的修改操作

    今天学习SpringBoot 的 CRUD 操作,练习 修改操作 时,发生了如下的异常: [nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResol ...

  8. golang中slice切片的修改操作

    本文主要介绍go语言中切片slice的增删修改操作. 如果我们需要往切片中追加元素,可以使用内置的append()函数.这个函数接受一个需要被追加的切片,以及一个或者多个需要被追加的元素.如果我们需要 ...

  9. MongoDB Wiredtiger存储引擎实现原理——Copy on write的方式管理修改操作,Btree cache...

    转自:http://www.mongoing.com/archives/2540 传统数据库引擎的数据组织方式,一般存储引擎都是采用 btree 或者 lsm tree 来实现索引,但是索引的最小单位 ...

最新文章

  1. 如何快速坐地铁高铁?舒工为您带来满满的都是干货~
  2. 【杂谈】GAN最成功的3个商业化落地领域,你是否了解过?
  3. 中国发电机行业应用前景与投资策略分析报告2022版
  4. 公文字体字号标准2020_手把手教你写公文——红头文件的制作技巧
  5. 狂神说es笔记_人教版七上英语Unit5电子课本音频+课堂笔记+课后同步习题
  6. java web开发常见问题_JavaWeb学习笔记(五)--Web开发其他常见问题
  7. 大赛评委共论技术趋势,大咖观点干货满满!
  8. 【Qt教程】1.11 - Qt5 标准对话框QMessageBox(关于、错误、信息、警告、问题、颜色、字体、文件对话框)
  9. 基于单片机的超市储物柜设计_毕业设计论-单片机储物柜
  10. Android 开发者不得不面对的六个问题
  11. dex2java_dex2jar 使用方法 | 学步园
  12. MPI 初认识 (入门教程)
  13. VC++设置默认音频设备(附源码)
  14. dnfdpl服务器维护了,梦想开始的地方丨山东沙排女将王鑫鑫奥运首秀止步八强 怕影响训练父母没来济南探望过...
  15. kru生成树变种 poj3522 bzoj 1196
  16. DATEDIF函数:
  17. Java 获取文件的真实类型,修改后缀名也能识别出来
  18. window.opener用法(在子窗体中获得父窗体的方法)
  19. 查看Android版本支持哪些蓝牙协议
  20. Freeman链码(弗雷曼链码)--matlab实现

热门文章

  1. 开源聚合路由 OpenMPTCProuter 配置使用
  2. Python爬虫实战,pyecharts模块,Python实现奥斯卡金像奖数据可视化
  3. 2021-10-23 python第一天
  4. Java的synchronized的使用_Java synchronized的使用
  5. 六大服务器和网络监控工具
  6. 工信部敏感权限Android端排查快速检索
  7. 案例分析企业微信带来的功能效果?
  8. 带薪“看片”?继阿里后微信也公开招聘“鉴黄师”!
  9. Sentinel-2数据辐射定标及大气校正
  10. 数学基础task06 一元函数积分学的概念与计算