zoukankan      html  css  js  c++  java
  • 工作中的bug:for循环里面的创建对象和for循环外面创建对象

    写这个博客的作用主要是给自己涨涨记性,以后像这种低级的错误最好不要再犯。

    先看一下报错的日志:

    1 2019-12-25 18:12:58.197 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : 进入更新后的InsPart
    2 2019-12-25 18:12:58.197 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : mSql: insert into LPEdorItem ( EdorAcceptNo,EdorNo,EdorCode,PolicyNo,CustomerID,EdorState,ChangeMoney,BillMoney,EdorValiDate,Creator,Operator,MakeDate,MakeTime,ModifyDate,ModifyTime ) values ( 'MGU201912461201912358','EN20191225026','RE','MGU201912461','000000','10',1000.0,0.0,'2019-12-25','001','001','2019-12-25','18:12:41','2019-12-25','18:12:41' )
    3 2019-12-25 18:12:58.246 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : mSql: delete from LPDebitNote where EdorNo='EN20191225026' and DebitNoteNo='DN0000000234'
    4 2019-12-25 18:12:58.246 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : mSql: delete from LPDebitNote where EdorNo='EN20191225026' and DebitNoteNo='DN0000000234'
    5 2019-12-25 18:12:58.372 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : 进入更新后的InsPart
    6 2019-12-25 18:12:58.372 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : mSql: insert into LPDebitNote ( EdorNo,EdorCode,DebitNoteNo,DNTAmount,DebitNoteTitle,PaidAmnt,PaidCurr,PayDate,Status,VerificationAnt,DebitNoteMode,SubInsurerId,BankAccId,RiskCode,Creator,Operator,MakeDate,MakeTime,ModifyDate,ModifyTime ) values ( 'EN20191225026','RE','DN0000000234',1000.0,'22',1000.0,'01','2020-01-24','01',0.0,'04','ZCB-003-111','888888','X151','001','001','2019-12-25','18:12:41','2019-12-25','18:12:41' )
    7 2019-12-25 18:12:58.372 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : 进入更新后的InsPart
    8 2019-12-25 18:12:58.372 DEBUG 12332 --- [io-8080-exec-10] com.sinosoft.utility.SQLString           : mSql: insert into LPDebitNote ( EdorNo,EdorCode,DebitNoteNo,DNTAmount,DebitNoteTitle,PaidAmnt,PaidCurr,PayDate,Status,VerificationAnt,DebitNoteMode,SubInsurerId,BankAccId,RiskCode,Creator,Operator,MakeDate,MakeTime,ModifyDate,ModifyTime )
     values ( 'EN20191225026','RE','DN0000000234',1000.0,'22',1000.0,'01','2020-01-24','01',0.0,'04','ZCB-003-111','888888','X151','001','001','2019-12-25','18:12:41','2019-12-25','18:12:41' )

    从报错日志上面看,这个错误已经很明显了,在执行向LPDebitNote表中插入数据的时候报主键冲突。从SQL语句中看,确实是这样的。

    在看一下自己之前写的代码:

    其实在最上面还有一行:LPDebitNoteSchema tLPDebitNoteSchema = new LPDebitNoteSchema();

     现在不难看出是因为给mlpdebitnotese集合中添加了两个相同的tLPDebitNoteSchema 对象,而且都是最后一次循环的那个对象。

    改正之后的代码:

     1             SQLwithBindVariables sqlbv = new SQLwithBindVariables();
     2             String tSql = "SELECT * FROM LCDebitNoteDet WHERE PolicyNo='?PolicyNo?' ";
     3             sqlbv = new SQLwithBindVariables();
     4             sqlbv.sql(tSql);
     5             sqlbv.put("PolicyNo", mLPEdorAppSchema.getPolicyNo());
     6             tLCDebitNoteDetSet = tLCDebitNoteDetDB.executeQuery(sqlbv);
     7             //在LCDEBITNOTEDET表里面一个保单号能有多个DEBITNOTENO
     8             if(tLCDebitNoteDetSet!=null&&tLCDebitNoteDetSet.size()>0){
     9                 for (int i = 1; i <=tLCDebitNoteDetSet.size() ; i++) {
    10                     LPDebitNoteSchema tLPDebitNoteSchema = new LPDebitNoteSchema();
    11                     SQLwithBindVariables sqlbv1 = new SQLwithBindVariables();
    12                     String tSql1 = "SELECT * FROM LCDebitNote WHERE DebitNoteNo='?DebitNoteNo?' ";
    13                     sqlbv1 = new SQLwithBindVariables();
    14                     sqlbv1.sql(tSql1);
    15                     sqlbv1.put("DebitNoteNo", tLCDebitNoteDetSet.get(i).getDebitNoteNo());
    16                     tLCDebitNoteSet = tLCDebitNoteDB.executeQuery(sqlbv1);
    17                     if (tLCDebitNoteSet != null && tLCDebitNoteSet.size() > 0) {
    18                         tLCDebitNoteSchema = tLCDebitNoteSet.get(1);
    19                         this.mReflections.transFields(tLPDebitNoteSchema, tLCDebitNoteSchema);
    20                         tLPDebitNoteSchema.setEdorNo(mEdorNo);
    21                         tLPDebitNoteSchema.setEdorCode(mLPEdorAppSchema.getEdorCode());
    22                         //   tLPDebitNoteSchema.setSelfPayOffState("02");签发的时候在进行状态的改变
    23                         // tLPDebitNoteSchema.setVerificationDate(mCurrentDate);
    24                         tLPDebitNoteSchema.setOperator(mG.Operator);
    25                         tLPDebitNoteSchema.setMakeDate(mCurrentDate);
    26                         tLPDebitNoteSchema.setMakeTime(mCurrentTime);
    27                         tLPDebitNoteSchema.setModifyDate(mCurrentDate);
    28                         tLPDebitNoteSchema.setModifyTime(mCurrentTime);
    29                         //mMap.put(tLPDebitNoteSchema,"DELETE&INSERT");
    30                     }
    31                     mLPDebitNoteSet.add(tLPDebitNoteSchema);
    32                 }
    33                 mMap.put(mLPDebitNoteSet,"DELETE&INSERT");
    34             }

    这次就能完美运行了,不会报主键冲突了。

  • 相关阅读:
    上传图片到PHP服务器
    关于对象、数字、地理位置使用上需要注意的地方
    apiCloud app调用浏览器打开网页的方法
    APICloud开发小技巧(一)
    JavaScript数组操作函数
    超实用的JavaScript代码段
    JSESSIONID的简单说明
    数据库锁表及阻塞的原因和解决办法
    Spring详解------事务管理
    HttpServletrequest 与HttpServletResponse总结
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/12100487.html
Copyright © 2011-2022 走看看