a308812025 2011-12-15 12:49
浏览 278
已采纳

Hibernate 查询之前 缺先做了update,请问这是怎么回事啊???

[quote]
简述:前台 封装有两个属性 分别是 Stock(实体).product(货品).productID(货品ID)、Stock(实体).warehouse(仓库).warehouseID(仓库ID),后天 封装成 Object[],传到Dao里面 做查询,但是,在select 之前缺做了update 很郁闷,不知道怎么回事,因为本代码 是关系着影响Stock(库存)里面货品的数量的,先更新了 我的代码其实就乱掉了,数据出错呢!!!!
[/quote]
[code="html"]

[/code]
[code="java"]
//组装save
public String savezuzhuang(){
List staList = new ArrayList();
String msg = "";
// 根据库位和物品ID得到库存
Object[] object = new Object[{stock.getProduct().getProductID(),stock.getWarehouse().getWarehouseID()};
Stock stocka = stockService.getStockByProAndWare(object);
Stock stockMu = new Stock();
if (stocka == null) {
stockMu.setProduct(stock.getProduct()); // 入库货品
stockMu.setWarehouse(stock.getWarehouse()); // 仓库
stockMu.setWarehouseName(stock.getWarehouse().getWarehouseName());// 仓库名
stockMu.setStockCount(stock.getStockCount());// 入库数量
stockMu.setQichuCount(0); // 期初数量
stockMu.setBenqirukuCount(stock.getStockCount());// 本期入库总数
stockMu.setBenqichukuCount(0); // 本期出库总数
stockMu.setMaxPrice(stock.getAveragePrice());
stockMu.setMinPrice(stock.getAveragePrice());
stockMu.setAveragePrice(stock.getAveragePrice());
stockMu.setLastPrice(stock.getAveragePrice());
} else {
stockMu = stocka;
stockMu.setStockCount(stock.getStockCount()+ stocka.getStockCount());
stockMu.setBenqirukuCount(stock.getStockCount()+ stocka.getBenqirukuCount());
if (stocka.getMaxPrice() < stock.getAveragePrice()) {
stockMu.setMaxPrice(stock.getAveragePrice());
}
if (stocka.getMinPrice() > stock.getAveragePrice()) {
stockMu.setMinPrice(stock.getAveragePrice());
}
stockMu.setLastPrice(stock.getAveragePrice());
double newAveragePrice = getAveragePrice(stocka, stock.getAveragePrice(), stock.getStockCount());
stockMu.setAveragePrice(newAveragePrice);
}
boolean bool = true;
for(Stock st : stList){
if(st != null){
if(st.getProduct().getProductID() != 0 && st.getWarehouse().getWarehouseID() != 0){
String productName = st.getProduct().getProductName();
String warehouseName = st.getWarehouseName();
// 根据库位和物品ID得到库存
Object[] object1 = new Object[] {st.getProduct().getProductID(),st.getWarehouse().getWarehouseID()};
Stock stockaa = stockService.getStockByProAndWare(object1);
if(stockaa == null){
msg = "<"+productName+">" + " 在 " + warehouseName + " 没有入库货品,请采购!";
bool = false;
break;
}else{
if(st.getStockCount() > stockaa.getStockCount()){
msg = "<"+productName+">" + " 在 " + warehouseName + " 产生负库存!";
bool = false;
break;
}else{
stockaa.setStockCount(stockaa.getStockCount()-st.getStockCount());
stockaa.setBenqichukuCount(stockaa.getBenqichukuCount()+st.getStockCount());
staList.add(stockaa);
bool = true;
}
}
}
}
}
ServletActionContext.getResponse().setCharacterEncoding("utf-8");
try {
ServletActionContext.getResponse().getWriter().write(msg);
} catch (IOException e) {
e.printStackTrace();
}
if(bool == true){
productMubanService.saveProductZuzhuangService(stockMu, staList);
}
return null;
}
[/code]
[code="java"]
public Stock getStockByProAndWare(Object[] object) {
String hql = "from Stock stock where stock.product.productID=? and stock.warehouse.warehouseID =?";
return (Stock) this.getHibernateTemplate().find(hql, object).get(0);
}
[/code]
[code="java"]
public void saveProductZuzhuangService(Stock stock,List stList){
stockDao.saveOrUpdate(stock);//执行的是hibernate 的 saveOrUpdate 方法
for(Stock st : stList){
stockDao.update(st);
}
}
[/code]
[quote]
后台 运行Log:
[code="java"]
Hibernate: select stock0_.stockid as stockid28_, stock0_.pro_id as pro2_28_, stock0_.warehouse_id as warehouse3_28_, stock0_.warehouseName as warehous4_28_, stock0_.stockCount as stockCount28_, stock0_.qichuCount as qichuCount28_, stock0_.benqirukuCount as benqiruk7_28_, stock0_.benqichukuCount as benqichu8_28_, stock0_.yingkuiCount as yingkuiC9_28_, stock0_.averagePrice as average10_28_, stock0_.maxPrice as maxPrice28_, stock0_.minPrice as minPrice28_, stock0_.lastPrice as lastPrice28_ from stock stock0_ where stock0_.pro_id=? and stock0_.warehouse_id=?

Hibernate: update stock set pro_id=?, warehouse_id=?, warehouseName=?, stockCount=?, qichuCount=?, benqirukuCount=?, benqichukuCount=?, yingkuiCount=?, averagePrice=?, maxPrice=?, minPrice=?, lastPrice=? where stockid=?

Hibernate: select stock0_.stockid as stockid28_, stock0_.pro_id as pro2_28_, stock0_.warehouse_id as warehouse3_28_, stock0_.warehouseName as warehous4_28_, stock0_.stockCount as stockCount28_, stock0_.qichuCount as qichuCount28_, stock0_.benqirukuCount as benqiruk7_28_, stock0_.benqichukuCount as benqichu8_28_, stock0_.yingkuiCount as yingkuiC9_28_, stock0_.averagePrice as average10_28_, stock0_.maxPrice as maxPrice28_, stock0_.minPrice as minPrice28_, stock0_.lastPrice as lastPrice28_ from stock stock0_ where stock0_.pro_id=? and stock0_.warehouse_id=?

Hibernate: update stock set pro_id=?, warehouse_id=?, warehouseName=?, stockCount=?, qichuCount=?, benqirukuCount=?, benqichukuCount=?, yingkuiCount=?, averagePrice=?, maxPrice=?, minPrice=?, lastPrice=? where stockid=?

Hibernate: select stock0_.stockid as stockid28_, stock0_.pro_id as pro2_28_, stock0_.warehouse_id as warehouse3_28_, stock0_.warehouseName as warehous4_28_, stock0_.stockCount as stockCount28_, stock0_.qichuCount as qichuCount28_, stock0_.benqirukuCount as benqiruk7_28_, stock0_.benqichukuCount as benqichu8_28_, stock0_.yingkuiCount as yingkuiC9_28_, stock0_.averagePrice as average10_28_, stock0_.maxPrice as maxPrice28_, stock0_.minPrice as minPrice28_, stock0_.lastPrice as lastPrice28_ from stock stock0_ where stock0_.pro_id=? and stock0_.warehouse_id=?

Hibernate: update stock set pro_id=?, warehouse_id=?, warehouseName=?, stockCount=?, qichuCount=?, benqirukuCount=?, benqichukuCount=?, yingkuiCount=?, averagePrice=?, maxPrice=?, minPrice=?, lastPrice=? where stockid=?
Hibernate: select stock0_.stockid as stockid28_, stock0_.pro_id as pro2_28_, stock0_.warehouse_id as warehouse3_28_, stock0_.warehouseName as warehous4_28_, stock0_.stockCount as stockCount28_, stock0_.qichuCount as qichuCount28_, stock0_.benqirukuCount as benqiruk7_28_, stock0_.benqichukuCount as benqichu8_28_, stock0_.yingkuiCount as yingkuiC9_28_, stock0_.averagePrice as average10_28_, stock0_.maxPrice as maxPrice28_, stock0_.minPrice as minPrice28_, stock0_.lastPrice as lastPrice28_ from stock stock0_ where stock0_.pro_id=? and stock0_.warehouse_id=?

Hibernate: update stock set pro_id=?, warehouse_id=?, warehouseName=?, stockCount=?, qichuCount=?, benqirukuCount=?, benqichukuCount=?, yingkuiCount=?, averagePrice=?, maxPrice=?, minPrice=?, lastPrice=? where stockid=?
[/code]
[/quote]
[quote]
疑问:按步骤来说 在执行service 方法时:应该是 要么一起执行 要么事物回滚。就是说1、update2、接着update。。这样的流程,可是上面的hibernate 自动的先update 是怎么回事,我又没有 给它session????请给位帮忙看下 指点迷津,不胜感激!!
[/quote]

  • 写回答

2条回答 默认 最新

  • lwcgglu 2011-12-16 10:23
    关注

    session的commit方式默认是auto(你设置成commit 或者 manual 应该就不会了)。

    先执行update操作,应该是放在获取的数据是脏数据吧。
    而且你查询出来的对象应该立即从session缓存去掉,否则你查询出来的应该还是你更新后的数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘