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