2013-10-29 107 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