qq_37783264 2020-09-07 14:31 采纳率: 16.7%
浏览 84
已结题

关于hibernate框架持久化的问题

因为我本人从毕业就一直使用的mybatis,写的是sql,但是公司的老代码需要进行维护性质的开发,需要使用hibernate。在使用过程中出现了一个很奇怪的问题

BarBoxTempInfo info = iBarBoxTempInfoEao.getBarBoxInfo(
                        p.getBarcode(), p.getCollectTime());

                if (info == null) {// 不重复则添加
                    info = new BarBoxTempInfo();

                    info.setBarcode(p.getBarcode());
                    info.setOperateTime(FormatDate.parStr2Time(
                            p.getCollectTime(),
                            FormatDate.DATE_TIME_SEC_FOR_PRO));
                    info.setProduceBill(req.getProduceBill());
                    info.setHandleStatus(new BigDecimal(0));
                    info.setDeviceId(p.getDeviceId());
                    info.setCreateBy(req.getUserAccount());
                    info.setUpdateBy(req.getUserAccount());
                    info.setCreateTime(new Timestamp((new Date()).getTime()));
                    info.setUpdateTime(new Timestamp((new Date()).getTime()));
                    try {
                        iBarBoxTempInfoEao.save(info);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                } else {
                    errList.add(p.getBarcode());
                }

以上是我的代码逻辑,通过调用getBarBoxInfo判定数据库是否有重复,如果有就计入errList。没有就新增数据。怪就怪在这里,我通过debug调试的时候发现getBarBoxInfo方法返回的是null,得到结果info=null所以通过了判定,然后调用了save方法,但是数据并没有添加到数据库之中,程序也并没有抛出任何异常,以下是我getBarBoxInfo方法中的代码

//      StringBuilder sb = new StringBuilder("1=1");
//      List<Object> params = new ArrayList<Object>();
//      if (StringUtils.isNotBlank(barcode)) {
//          params.add(barcode);
//          sb.append(" and t.barcode = ?" + params.size());
//      } else{
//          sb.append(" and ( t.barcode = ''  or t.barcode is null) " );
//      }
//      if (StringUtils.isNotBlank(collectTime)){
//          params.add(collectTime);
//          sb.append(" and t.operateTime = ?" + params.size());
//      }else{
//          sb.append(" and t.operateTime is null " );
//      }
//
//      return this.getResult(sb.toString(), params.toArray());

然后经过一系列的尝试,偶然发现,当我不调用getBarBoxInfo方法,直接定义BarBoxTempInfo info = null,然后就save成功了。后续我没有使用jpql,改为sql也save成功了。以下是getBarBoxInfo里面的save成功的代码。

    StringBuffer sql = new StringBuffer(" SELECT * FROM BAR_BOX_TEMP_INFO t WHERE 1=1 ");
        List<Object> params = new ArrayList<Object>();
        if (StringUtils.isNotBlank(barcode)) {
            params.add(barcode);
            sql.append(" and t.BARCODE = ?" + params.size());
        } else{
            sql.append(" and ( t.BARCODE = ''  or t.BARCODE is null) " );
        }
        if (StringUtils.isNotBlank(collectTime)) {
            params.add(collectTime);
            sql.append(" and TO_CHAR(t.OPERATE_TIME,'YYYY-MM-DD hh24:mi:ss') = ?" + params.size());
        } else{
            sql.append(" and TO_CHAR(t.OPERATE_TIME,'YYYY-MM-DD hh24:mi:ss') IS null " );
        }

        List<BarBoxTempInfo> list = this.getResultListBySql(sql.toString(), params.toArray());
        if(list!=null&&list.size()>0){
            return list.get(0);
        }

这就是我疑惑的地方,调用getBarBoxInfo方法返回的是null,但是save不成功,直接定义info=null,save成功。有没有使用过hibernate的程序员老手来解答一下疑惑?

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-09-07 22:53
    关注

    看看是不是并发和锁的问题,但是我怀疑还是你的调试出现了错觉,也就是调用getBarBoxInfo方法返回的不是null,或者你没有调用 session.save / flush

    评论

报告相同问题?

悬赏问题

  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?