Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate中更新记录时出现的问题_Java_Hibernate_Struts - Fatal编程技术网

Java Hibernate中更新记录时出现的问题

Java Hibernate中更新记录时出现的问题,java,hibernate,struts,Java,Hibernate,Struts,您好,我正在使用Hibernate更新表中的记录。我在另一个表中插入相同的记录。它在一个循环中,但当我更新记录时,我得到的异常是锁等待超时异常。请问谁能解决这个问题?提前谢谢 try { SalesInventoryDAO dao = new SalesInventoryDAO(); sess = HibernateUtil.getSessionFactory().openSession(); Transaction tx =

您好,我正在使用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();
        }

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

以下是一些建议:

  • “锁定等待超时”通常在事务正在等待时发生 要更新的数据行已被其他某些用户锁定 交易
  • 大多数情况下,问题在于数据库 一边可能的原因可能是桌子设计不当、尺寸过大 数据量、约束条件等

请查看以了解更多详细信息。

在打开新事务之前提交事务

Transaction currentTx = sess.beginTransaction();
..

currentTx.commit();
..
currentTx = sess.beginTransaction();
编辑:
在dao中,您打开新事务,而不是使用以前的事务。。您应该阅读一些关于java/hibernate中事务管理的教程。

您是否试图在循环中的每个迭代中创建/开始事务?是的,每次在DAO中创建一个全新的会话时,我都会这样做!既然已经有了一个会话,为什么不使用相同的会话呢?将同一会话传递给DAO方法,并在DAO方法中使用该会话。会话本身可以有多个事务。因此,创建一次会话,必要时在其中使用多个事务。这将解决您的问题。现在它给了我另一个例外,因为对象引用了一个未保存的临时实例-在刷新之前保存临时实例:com.treamis.inventory.goodsReceived.goodsReceived thanks first things first。您似乎没有利用Hibernate的主要功能。在DAO中,您编写了一个查询来更新名为Item的实体。相反,如果您使用Hibernate设置了到项实体的持久性映射,那么实际上不必编写更新查询。Hibernate非常容易为您进行更新,您只需要使用sess.update(item)。这将在内部转换为本机SQL查询,并将被持久化。对于未保存的临时实例异常,应在集合映射中包含cascade=“all”(如果使用xml)或cascade=CascadeType.all(如果使用注释)。这是因为您的实体中有一个集合,而该集合中有一个或多个数据库中不存在的项。通过指定上述选项,您可以告诉hibernate在保存其父对象时将其保存到数据库中。
Transaction currentTx = sess.beginTransaction();
..

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