Hibernate中executeUpdate的缓存问题

业务场景
在单据处理服务中需要处理以下业务逻辑:
1:修改product_sale_stock中商品在对应仓库的实物库存stock与销售占用sales
2:修改pss_total_stock中商品的总可用库存availableQuantity
3:product_sale_stock与pss_total_stock需要保持数据的完整性

代码实现

   @Override
    public void documentsProcessing(Long productSale,Long dc, int stock,int sales){
        //第一步 hql 查询
        ProductSaleStockVo productSaleStockVo = productSaleStockService.queryProductSaleStockPo(productSale, dc);
        
        //第二步 修改product_sale_stock中商品在对应仓库的实物库存stock与销售占用sales
        //hql更新  @Query(value="update ProductSaleStockPo set stock=?,sales=? where id=?",executeUpdate = true)
        productSaleStockDao.updateStockAndSales(stock,sales,productSaleStockVo.getId());
        
        //第三步 hql查询
        List productSaleStockVos=productSaleStockService.findByProductSale(productSale);
        //计算当前商品的总可用库存
        int totalAvailableQuantity=0;
        for(ProductSaleStockVo vo :productSaleStockVos){
            int AvailableQuantity=vo.getStock()-vo.getSales();
            totalAvailableQuantity+=AvailableQuantity;
        }
        
        //第四步 修改pss_total_stock中商品的总可用库存totalAvailableStock
        //hql更新  @Query(value = "update TotalStockPo set availableQuantity=? where id=? ",executeUpdate = true)
        totalStockDao.updateAvailableQuantity(totalAvailableQuantity,productSale);
    }

单元测试当前服务

  @Test
    public void testUpdateStock() {
        stockDocumentsService.documentsProcessing(1201414652L,110008L,50,5);
    }

执行SELECT * FROM product_sale_stock where productsale=1201414652 查看product_sale_stock中修改后的数据库
Hibernate中executeUpdate的缓存问题_第1张图片
执行SELECT * FROM product_sale_stock where productsale=1201414652查看 pss_total_stock中修改后的数据库
Hibernate中executeUpdate的缓存问题_第2张图片
结论与原因分析
product_sale_stock与pss_total_stock没有保持数据的完整性
因为在第二步操作中 executeUpdate不会更改一级缓存的数据,虽然是执行的hql,但是底层又被转换为了sql去执行,所以导致第三步中查询出来的数据是修改以前的数据。

如何优化代码
把第三步的hql查询调整为sql查询

你可能感兴趣的:(hibernate学习笔记)