繁体   English   中英

在Hibernate中更新记录的问题

[英]Issue in updating records in Hibernate

嗨,我正在使用Hibernate更新表中的记录。 我在另一个表中插入相同的记录。 这是一个循环,但是在更新记录时,我收到了异常,如锁定等待超时异常。 请有人能解决这个问题吗? 提前致谢!

try {
            SalesInventoryDAO dao = new SalesInventoryDAO();
            sess = HibernateUtil.getSessionFactory().openSession();
           Transaction tx = ses.beginTransaction();
            GoodsRecievedForm item = (GoodsRecievedForm) form;
            GoodsRecieved bk = new GoodsRecieved();
            bk.setGoodsId(item.getGoodsId());
            InventoryOrder order = (InventoryOrder) sess.get(InventoryOrder.class, item.getOrderNo());
            bk.setOrderNo(order);
//            if (order.getQuotation().getQuotationNo() != null) {
//                bk.setQuotation(order.getQuotation().getQuotationNo());
//            } else {
//                bk.setQuotation(null);
//            }

            java.util.Date temp = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(item.getRecievedDate());
            java.sql.Date temp1 = new java.sql.Date(temp.getTime());
            bk.setRecievedDate(temp1);
            bk.setOrderQty(order.getTotalqty());
            bk.setReceivedPersonName(item.getReceivedPersonName());
            bk.setReceivedQty(item.getReceivedQty());
            bk.setConditionOfMaterial(item.getConditionOfMaterial());
            UserEntity msg;
            HttpSession session = request.getSession(false);
            msg = (UserEntity) session.getAttribute("user");
            bk.setAddedBy(msg);
            bk.setAddedDate(new Date());
            int[] item1111 = item.getGoodsDetails();
            String[] productre = item.getGoodsDetailsName();
            float proqty[] = item.getGoodsDetailsQty();
            float price[] = item.getGoodsDetailsPrice();
            float receivedqty[] = item.getReceivedquantity();
            GoodsReceivedDetails mb;
            Set<GoodsReceivedDetails> purDetails = new HashSet();
            for (int i = 0; i < productre.length; i++) {
                mb = new GoodsReceivedDetails();
                mb.setGoodsDetailsName(productre[i]);
                mb.setGoodsDetailsQty(proqty[i]);
                mb.setGoodsDetailsPrice(price[i]);
                mb.setReceivedquantity(receivedqty[i]);
                //System.out.println("productre" + productre[i]);
                int id3 = item1111[i];
                //System.out.println("id3id3id3id3" + id3);
                // int id3 = Integer.parseInt(productre[i]);
                Item idf = (Item) sess.get(Item.class, id3);
                float qty = (idf.getItemStock() + mb.getReceivedquantity());
//                mb.setItemId(idf);
//                mb.setItemId(idf);
                dao.updateitem(qty, idf);
                //dao.updateitem(idf);
                mb.setGoodsId(bk);
                sess.save(mb);
                purDetails.add(mb);
            }

            bk.setGoodsDetails(purDetails);
            sess.save(bk);
          tx.commit;

            //System.out.println("comming");
//            List ls = gdao.getOrderItems(order.getOrderId());
//            for (Iterator it = ls.iterator(); it.hasNext();) {
//                InventoryOrderDetails inv = (InventoryOrderDetails) it.next();
//                gdao.updateitem(inv.getItemId().getItemStock() + bk.getReceivedQty(), inv.getItemId());
//            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sess.close();
        }

这是我的道代码

public void updateitem(float stock, Item itm) {
        Session ses = HibernateUtil.getSessionFactory().openSession();
        ////System.out.println("itmitmitm" + itm.getItemId());
        Transaction tx = ses.beginTransaction();
        Query qry = ses.createQuery("UPDATE Item set itemStock='" + stock + "' where itemId='" + itm.getItemId() + "'");
        qry.executeUpdate();
        ses.close();
        tx.commit();

    }

您已经通过sess.beginTransaction();初始化了事务sess.beginTransaction(); 在开始甚至提交事务之前,您都在尝试重新初始化事务。 由于先前的事务尚未提交,这将导致内存泄漏。 因此,在开始另一笔交易之前,请提交上一笔。

以下是一些建议:

  • “锁定等待超时”通常发生在某个事务正在等待要更新的数据行上,而该行已被某些其他事务锁定时。
  • 在大多数情况下,问题出在数据库方面。 可能的原因可能是表格设计不当,数据量大,约束等。

请查看以获取更多详细信息。

在开始新交易之前提交交易

Transaction currentTx = sess.beginTransaction();
..

currentTx.commit();
..
currentTx = sess.beginTransaction();

编辑:在dao中,您打开新事务而不是使用上一个事务。.您应该阅读有关Java / hibernate中事务管理的一些教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM