简体   繁体   English

在Hibernate中更新记录的问题

[英]Issue in updating records in Hibernate

Hi I am using Hibernate to update the records in a table. 嗨,我正在使用Hibernate更新表中的记录。 And I'm inserting same records in another table. 我在另一个表中插入相同的记录。 It is in a loop, but I am getting exception as lock wait timeout exception when I am updating records. 这是一个循环,但是在更新记录时,我收到了异常,如锁定等待超时异常。 Please could anybody resolve this problem? 请有人能解决这个问题吗? Thanks in advance! 提前致谢!

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();
        }

This is my dao code.. 这是我的道代码

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();

    }

You have initialized a the transaction by sess.beginTransaction(); 您已经通过sess.beginTransaction();初始化了事务sess.beginTransaction(); in the beginning and before even committing the transaction, you've trying to re-initialize the transaction. 在开始甚至提交事务之前,您都在尝试重新初始化事务。 This will lead to memory leaks as the previous transactions hasn't been committed. 由于先前的事务尚未提交,这将导致内存泄漏。 So, before you begin another transaction, commit the previous one. 因此,在开始另一笔交易之前,请提交上一笔。

And here are some suggestions: 以下是一些建议:

  • 'Lock wait timeout' occurs typically when a transaction is waiting on row(s) of data to update which is already been locked by some other transaction. “锁定等待超时”通常发生在某个事务正在等待要更新的数据行上,而该行已被某些其他事务锁定时。
  • Most of the times, the problem lies on the database side. 在大多数情况下,问题出在数据库方面。 The possible causes may be a inappropriate table design, large amount of data, constraints etc. 可能的原因可能是表格设计不当,数据量大,约束等。

Please check out this for more details. 请查看以获取更多详细信息。

Commit transaction before opening new one 在开始新交易之前提交交易

Transaction currentTx = sess.beginTransaction();
..

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

EDIT: In dao you opening new transaction instead of use previous one.. you should read some tutorials about transaction management in java/hibernate. 编辑:在dao中,您打开新事务而不是使用上一个事务。.您应该阅读有关Java / hibernate中事务管理的一些教程。

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

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