开发者社区> 问答> 正文

hibernate不执行update,不抛错?报错

Shipment shipment = shipmentDao.getByDate(id, shipmentDate);
            OrderDetail od = baseDao.getById(OrderDetail.class, id);
            if (order == null) {
                order = od.getOrder();
            }
            if (shipment == null) {
                shipment = new Shipment();
                shipment.setOrderDetail(od);
                shipment.setTotal(total);
                shipment.setQuantity(quantity);
                shipment.setShipmentDate(shipmentDate);
                shipment.setType(type);
                baseDao.saveByObject(shipment);//这里执行保存成功
            } else {
                //因为Shipment是ManytoOne OrderDetail 并且是OrderDetail,这里获得的OrderDetail是lazy的od,这会造成下面的baseDao.updateByObject(od);不执行
                //如何解决
                shipment.setTotal(total);
                shipment.setQuantity(quantity);
                shipment.setType(type);
                baseDao.updateByObject(shipment);//这里不执行更新,也不打印update sql
            }
            od.setShipment(total);

            baseDao.updateByObject(od);

求大神帮忙

1.为何能保存到shipment,却不能update shipment,也不报错

2.如何解决获取的OrderDetail是lazy,我想从DB里获取,不是从缓存

另外一个方法

Shipment shipment = baseDao.getById(Shipment.class, id);
        baseDao.deleteByObject(shipment);
        OrderDetail od = shipment.getOrderDetail();
        od.setShipment(od.getShipment() - shipment.getTotal());
        baseDao.updateByObject(od);
        Order order = od.getOrder();
        order.setShipment(order.getShipment() - shipment.getTotal());
        baseDao.updateByObject(order);
        ProductionProcess process = productionProcessDao.getByOrderDetailAndDate(od.getId(), shipment.getShipmentDate());
        process.setShipment(0);
这里第2行也出现不能删除shipment

展开
收起
爱吃鱼的程序员 2020-06-20 17:20:07 446 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
     baseDao.getById 应该是没和spring事务aop挂钩。可能要修改为  baseDao.updateXXX八成是事务的问题事务没有提交,

    Hibernate会优化执行的SQL,执行的SQL顺序Hibernate优化过后并不能保证一致。

    baseDao.update之前先执行baseDao.get(); 会触发update事件

    2020-06-20 17:20:26
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载