Hibernate执行save方法 注意

该方法中有问题!!!!!

错误是在for循环中将订货单的信息和采购单的信息存放到中间表中,但第一次执行到:

  //因为每次审核时只是生成一个采购单,所以只需保存这个采购单
                        //frank 当销货单添加成功后获取销货单的id 和no 及类名称
                        qcyReceiptsConnection.setSeedId(qcyPurchaseInfo.getId());
                        qcyReceiptsConnection.setSeedNo(qcyPurchaseInfo.getNo());
                        qcyReceiptsConnection.setSeedClass("QcyPurchaseInfo");                
                        this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);

这段代码时会发出sql命令,但是当第二次执行到此段代码时,就不会发出sql命令。

错误原因是:

  //frank add
                Timestamp ts = new Timestamp(new Date().getTime());
                QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank   单据关联实体类
                qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
                qcyReceiptsConnection.setParentNo(pageObject.getNo());
                qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
                qcyReceiptsConnection.setCreator(user);
                qcyReceiptsConnection.setCreateTime(ts);
                qcyReceiptsConnection.setModifier(user);
                qcyReceiptsConnection.setModifyTime(ts);   

这段代码中的QcyReceiptsConnection实体类只new了一次,所以要想让       this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection); 这段代码每次执行都发出sql语句只需要new新的实体就行。

        QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank   单据关联实体类
                qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
                qcyReceiptsConnection.setParentNo(pageObject.getNo());
                qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
                qcyReceiptsConnection.setCreator(user);
                qcyReceiptsConnection.setCreateTime(ts);
                qcyReceiptsConnection.setModifier(user);
                qcyReceiptsConnection.setModifyTime(ts);  

                       //因为每次审核时只是生成一个采购单,所以只需保存这个采购单

                        //frank 当销货单添加成功后获取销货单的id 和no 及类名称
                        qcyReceiptsConnection.setSeedId(qcyPurchaseInfo.getId());
                        qcyReceiptsConnection.setSeedNo(qcyPurchaseInfo.getNo());
                        qcyReceiptsConnection.setSeedClass("QcyPurchaseInfo");                
                        this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);

这样修改就行




/**

     * <b>审核与退回的相关操作</b> <b>Peter</b>
     */
    public void saveAuditAndUnaudit(QcyUnitedOrderInfo pageObject,String isExternal, int i, String[] nos, CommonService service,SysUser user )
            throws Exception {    
        //frank add
                Timestamp ts = new Timestamp(new Date().getTime());
                QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank   单据关联实体类
                qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
                qcyReceiptsConnection.setParentNo(pageObject.getNo());
                qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
                qcyReceiptsConnection.setCreator(user);
                qcyReceiptsConnection.setCreateTime(ts);
                qcyReceiptsConnection.setModifier(user);
                qcyReceiptsConnection.setModifyTime(ts);   


        
        if (null != pageObject.getId()) {
            // pageObject.setIsAudit(i + "");
            this.getQcyUnitedOrderInfoDAO().update(pageObject);
        }
        // 审核通过后,要对销货单,采购单,验收单进行自动生成
        String salesSlipNo = nos[0];
        // String purchaseInfoNo = nos[1];
        // String acceptenceInfoNo = nos[2];
        Date now = new Date();
        if (i == 1) {
            List<Object> paramsList = new ArrayList<Object>();
            SqlStoreUtil util = new SqlStoreUtil();
            if (!"1".equals(isExternal)) {
                // 销货单转换
                QcySalesSlip salesItem = new QcySalesSlip();
                salesItem.setBranch(pageObject.getBranch());
                salesItem.setRequestBranch(pageObject.getRequestBranch());
                salesItem.setNo(salesSlipNo);
                salesItem.setReceiptDate(pageObject.getReceiptDate());
                salesItem.setSalesDate(pageObject.getReceiptDate());
                salesItem.setStatus(ERPConstants.UNSAVED_RECEIPT);
                salesItem.setCreateTime(new Timestamp(now.getTime()));
                salesItem.setCreator(pageObject.getModifier());
                salesItem.setModifyTime(new Timestamp(now.getTime()));
                salesItem.setModifier(pageObject.getModifier());
                this.getQcyUnitedOrderInfoDAO().saveObject(salesItem);

                //frank 当销货单添加成功后获取销货单的id 和no 及类名称
                qcyReceiptsConnection.setSeedId(salesItem.getId());
                qcyReceiptsConnection.setSeedNo(salesItem.getNo());
                qcyReceiptsConnection.setSeedClass("QcySalesSlip");                    
                this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);
                //frank end
                
                paramsList.add(salesItem.getId());
                paramsList.add(pageObject.getId());
                List<IvtWarehouse> ivt = new ArrayList<IvtWarehouse>();
                ivt = (List<IvtWarehouse>) this.getQcyUnitedOrderInfoDAO().executeQuery("from IvtWarehouse as i where i.isDefault='1' and i.branch.id="+ pageObject.getBranch().getId());
                if (ivt.size() > 0) {
                    paramsList.add(ivt.get(0).getId());
                    this.getQcyUnitedOrderInfoDAO().executeSQLUpdate(util.convertSQL(util.qcyUnitedOrderInfo2QcySalesSlip,paramsList));
                } else {
                    System.out.println("审核失败,没有默认仓库");
                    return;
                }
            } else {
                // 采购单
                paramsList.clear();
                // paramsList.add(pageObject.getBranch() == null ? null
                // : pageObject.getBranch().getId());
                paramsList.add(pageObject.getId());
                // 提取数据 品项和供应商
                String queryhql = util.convertSQL(util.qcyUnitedOrderInfo2QcyPurchaseInfo, paramsList);
                // System.out.println(queryhql);
                List<Object[]> objectList = this.getQcyUnitedOrderInfoDAO().executeSQLQuery(queryhql);
                List<?> tempList = new ArrayList<QcyPurchaseInfo>();
                for (int j = 0; j < objectList.size(); j++) {
                    boolean isUpdate = false;// 更新表项的flag
                    Object[] objs = objectList.get(j);
                    // /判断这个供应商采购单是否存在
                    // 如果存在则更新,否则插入
                    BigInteger supplierId = (BigInteger) objs[5];
                    if (supplierId == null)
                        continue;
                    tempList = this.getQcyUnitedOrderInfoDAO().executeQuery(
                            "from QcyPurchaseInfo t where t.supplier.id = "+ supplierId + " and t.status = '"+ ERPConstants.SAVED_RECEIPT + "'");

                    QcyPurchaseInfo qcyPurchaseInfo = null;
                    if (null != tempList && tempList.size() > 0) {// 更新,并将表项插入(更新)这个表单
                        // 更新主表单信息
                        qcyPurchaseInfo = (QcyPurchaseInfo) tempList.get(0);
                        qcyPurchaseInfo.setModifier(pageObject.getModifier());
                        qcyPurchaseInfo.setModifyTime(pageObject.getModifyTime());
                        this.getQcyUnitedOrderInfoDAO().updateObject(    qcyPurchaseInfo);
                        // 检查是否有重复的子表项,如存在,则更新这个表项的数量,否则新增一个表项
                        String checkSql = "from QcyPurchaseInfoItem where header.id = "
                                + qcyPurchaseInfo.getId()+ " and branch.id = "+ supplierId+ " and itemNo = '"    + objs[0]+ "'";
                        List<?> checkList = this.getQcyUnitedOrderInfoDAO()
                                .executeQuery(checkSql);
                        if (null != checkList && checkList.size() > 0) {// 更新子表项
                            isUpdate = true;
                        } else {// 新增加子表项
                            isUpdate = false;
                        }
                    } else { // 新增主表单,并且将表项插入到这个表单
                        isUpdate = false;
                        qcyPurchaseInfo = new QcyPurchaseInfo();
                        qcyPurchaseInfo.setNo(service.getNo(    QcyPurchaseInfo.class, 3));
                        qcyPurchaseInfo.setPurchaseDate(now);
                        qcyPurchaseInfo.setReceiptDate(now);
                        qcyPurchaseInfo.setCreator(pageObject.getModifier());
                        qcyPurchaseInfo.setCreateTime(pageObject    .getModifyTime());
                        qcyPurchaseInfo.setModifier(pageObject.getModifier());
                        qcyPurchaseInfo.setModifyTime(pageObject.getModifyTime());
                        qcyPurchaseInfo.setStatus(ERPConstants.SAVED_RECEIPT);
                        BdSupplier bdSupplier = new BdSupplier();
                        bdSupplier.setId(supplierId.intValue());
                        qcyPurchaseInfo.setSupplier(bdSupplier);
                        this.getQcyUnitedOrderInfoDAO().saveObject(    qcyPurchaseInfo);

                       

               QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank   单据关联实体类
                qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
                qcyReceiptsConnection.setParentNo(pageObject.getNo());
                qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
                qcyReceiptsConnection.setCreator(user);
                qcyReceiptsConnection.setCreateTime(ts);
                qcyReceiptsConnection.setModifier(user);
                qcyReceiptsConnection.setModifyTime(ts);  

                       //因为每次审核时只是生成一个采购单,所以只需保存这个采购单

                        //frank 当销货单添加成功后获取销货单的id 和no 及类名称
                        qcyReceiptsConnection.setSeedId(qcyPurchaseInfo.getId());
                        qcyReceiptsConnection.setSeedNo(qcyPurchaseInfo.getNo());
                        qcyReceiptsConnection.setSeedClass("QcyPurchaseInfo");                
                        this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);
                    }
                    BdProduct product = null;
                    PurcInquiryInfoItem inquiry = null;
                    if (isUpdate == false) {
                        // 插入子表项
                        // 取默认规格
                        product = new BdProduct();
                        product = (BdProduct) this.getQcyUnitedOrderInfoDAO()
                                .getObject("from BdProduct as p where p.no='"+ (String) objs[0] + "'");
                        // 取供应商规格 仅限单供应商(一个商品只有一个供应商)
                        inquiry = new PurcInquiryInfoItem();
                        inquiry = (PurcInquiryInfoItem) this
                                .getQcyUnitedOrderInfoDAO().getObject(    "from PurcInquiryInfoItem as p where p.itemNo='"+ (String) objs[0] + "'");
                        // 构建子表
                        QcyPurchaseInfoItem qcyPurchaseInfoItem = new QcyPurchaseInfoItem();
                        qcyPurchaseInfoItem.setBranch(pageObject    .getRequestBranch());// pageObject.getBranch为null
                        qcyPurchaseInfoItem.setItemNo((String) objs[0]);
                        qcyPurchaseInfoItem.setItemName((String) objs[1]);
                        BdUnit bdUnit = new BdUnit();
                        bdUnit.setId(((Integer) objs[2]));
                        qcyPurchaseInfoItem.setUnit(bdUnit);
                        qcyPurchaseInfoItem.setPrice(objs[3] == null ? 0d: ((BigDecimal) objs[3]).doubleValue());
                        qcyPurchaseInfoItem.setOrderAmount((Integer) objs[4]    * product.getMain2Basic()/ inquiry.getMain2Basic());
                        qcyPurchaseInfoItem.setSubtotal(qcyPurchaseInfoItem.getPrice()* qcyPurchaseInfoItem.getOrderAmount());
                        qcyPurchaseInfoItem.setHeader(qcyPurchaseInfo);

                        this.getQcyUnitedOrderInfoDAO().saveObject(    qcyPurchaseInfoItem);
                    } else {
                        // 更新指定表项
                        // 还未进行单位换算
                        String updateSql = "update QcyPurchaseInfoItem set orderAmount = orderAmount +"
                                + objs[4]
                                + "where header.id = "
                                + qcyPurchaseInfo.getId()
                                + " and branch.id = "
                                + supplierId
                                + " and itemNo = '"
                                + objs[0]
                                + "'";
                        this.getQcyUnitedOrderInfoDAO().executeUpdate(updateSql);
                    }
                }
                
            }

        }
        // /退回相关操作
        else {

        }
    }


总结:Hibernate在执行save方法时,在for循环中要确保实体类每次都new一个新的,当为同一个实体类时,Hibernate就不会再发出sql命令。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值