2013-10-29 105 views
0

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

这是我的DAO代码..

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

    } 
+0

您正在DAO中再次创建一个全新的会话!既然你已经有一个现有的会话,为什么你不使用相同的?将相同的会话传递给DAO方法,并在DAO方法中使用该会话。会话本身可以有多个事务。因此,如果需要,创建一个会话,在其中使用多个事务。这将解决您的问题。 –

+0

现在它给了我另一个异常作为对象引用一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.treamis.inventory.goodsReceived.GoodsRecieved谢谢 – user2838630

+0

首先要做的第一件事。看起来你并没有使用Hibernate的主要功能。在DAO中,您已经编写了一个查询来更新名为Item的实体。相反,如果你使用Hibernate设置了持久映射到Item实体,你实际上不必编写更新查询。 Hibernate很容易为你做更新,你只需要使用sess.update(item)。这将在内部转换为原生SQL查询并将被保留。 –

回答

0

您已通过sess.beginTransaction();在开始初始化的事务,甚至之前提交事务,你想重新初始化事务。这会导致内存泄漏,因为之前的事务没有被提交。所以,在你开始另一个事务之前,先执行前一个事务。

这里有一些建议:

  • “锁等待超时”通常发生在事务在等待这已经被锁定一些其他 交易数据更新的 行(S)。
  • 大部分时候,问题出在数据库 这边。可能的原因可能是不恰当的表设计,大 数据量,约束等

请有关详细信息,请查看this

+0

我已经删除了第二个交易相同的错误得到 – user2838630

+0

您是否试图在循环的每个迭代中创建/开始事务? –

+0

是的,我每次都会这样做 – user2838630

0

打开新的

Transaction currentTx = sess.beginTransaction(); 
.. 

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

编辑之前提交的事务: 在DAO你打开新的事务,而不是使用前一个..你应该阅读有关事务管理的一些教程中的Java /休眠。

+0

我已经在其他dao类中提交了第一个事务... – user2838630

+0

可以üPLZ帮我解决这个问题 – user2838630

+0

@ user2838630 plese邮政编码的道然后 – smajlo