Java org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3853106/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 05:51:57  来源:igfitidea点击:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

javahibernate

提问by subbu

I am using struts and hibernate. I have a parent and child relation using set in hbm. In the action I am using session.saveOrUpdate()method to save but while saving it is showing the below error. Can anyone help regardng this with explanation where I made the mistake?

我正在使用支柱和休眠。我在 hbm 中有一个使用 set 的父子关系。在操作中,我使用session.saveOrUpdate()方法进行保存,但在保存时显示以下错误。任何人都可以帮忙解释一下我犯的错误吗?

Here is my hbm.file

这是我的 hbm.file

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

 <class name="com.model.cargo" table="cargo">
  <id name="id" column="id" type="java.lang.Long">
   <generator class="increment" />
  </id>
  <property name="cname" column="cname" />
  <property name="cdate" column="cdate" />
  <property name="csource" column="csource" />
  <property name="cdestination" column="cdestination" />
  <property name="create" column="createby" />
  <property name="status" column="status" />

  <set name="itemList" table="item" inverse="true"
   cascade="all-delete-orphan">
   <key>
    <column name="id" />
   </key>
   <one-to-many class="com.model.Item" />
  </set>
 </class>

 <class name="com.model.Item" table="item">
  <id name="itemid" column="itemid" type="java.lang.Long">
   <generator class="increment" />
  </id>
  <property name="itemName" column="itemname" />
  <property name="weight" column="weight" />
  <many-to-one class="com.model.cargo" name="cargo"
   column="id" />
 </class>
</hibernate-mapping>

My action

我的行动

package com.action;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.plugin.HibernatePlugIn;
import com.form.cargoForm;
import com.model.cargo;
import com.model.Item;


public class CargoAction extends DispatchAction {


 public ActionForward add(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {

  if (log.isDebugEnabled()) {
   log.debug("Entering Master add method");
  }

  try {

   cargoForm cargoForm = (cargoForm) form;
   //System.out.println("ID" + cargoForm.getId());
   cargo cargo = new cargo();
   System.out.println("in cargo Action");
   // copy customerform to model
   cargoForm.reset(mapping, request);
   BeanUtils.copyProperties(cargo, cargoForm);
   cargoForm.reset(mapping, request);
  // cargoForm.setInputParam("new");
   // updateFormBean(mapping, request, cargoForm);

  }

  catch (Exception ex) {
   ex.printStackTrace();
   return mapping.findForward("failure");
  }

  return mapping.findForward("success1");
 }

 public ActionForward save(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {

  SessionFactory sessionFactory=null;
  Session session =null;
  System.out.println("in cargo Action");
  try{
  sessionFactory = (SessionFactory) servlet
    .getServletContext().getAttribute(HibernatePlugIn.KEY_NAME);  
  session = sessionFactory.openSession();
  Transaction tx = session.beginTransaction();

  cargoForm carForm = (cargoForm) form;


  cargo cargo = new cargo();

  System.out.println("in cargo Action");

  BeanUtils.copyProperties(cargo,carForm);
  System.out.println("id"+ carForm.getId()); 
  System.out.println("item id"+ carForm.getItemid()); 
  Set itemset = carForm.getItemDtl();

    System.out.println("size"+itemset.size()); 
    Iterator iterator =itemset.iterator();   
    while(iterator.hasNext()) { 
     Item it = (Item)iterator.next();
    System.out.println("name"+it.getItemName()); //log.debug("HERE");
   it.setCargo(cargo); } 

  cargo.setItemList(itemset);
  System.out.println("size"+ itemset.size()); 
  session.saveOrUpdate("cargo",cargo);
  tx.commit();
  }catch(Exception e){
   e.printStackTrace();
  }
  return mapping.findForward("success");

 }

 public ActionForward search(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  System.out.println("in cargo search Action");
  SessionFactory sessionFactory = (SessionFactory) servlet
    .getServletContext().getAttribute(HibernatePlugIn.KEY_NAME);
  HttpSession session1 = request.getSession();
  Session session = sessionFactory.openSession();
  Transaction tx = session.beginTransaction();
  cargoForm cargoform = (cargoForm) form;
  // System.out.println("Name"+cargoForm.getName());
  cargo cargo = new cargo();
  System.out.println("in cargo search Action");
  // copy customerform to model
  BeanUtils.copyProperties(cargo, cargoform);
  String name;
  String status;
  String createby;

  name = cargo.getCname();
  status = cargo.getStatus();
  createby = cargo.getCreate();
  System.out.println("Name..." + name);
  System.out.println("status..." + status);
  System.out.println("createby..." + createby);
  try {
   if ((name.equals("")) && (createby.equals(""))
     && (status.equals("")))
    return mapping.findForward("failure");
   String SQL_QUERY = "from cargo c where c.cname=:name or c.status=:status or c.create=:createby";
   Query query = session.createQuery(SQL_QUERY);
   query.setParameter("name", name);
   query.setParameter("status", status);
   query.setParameter("createby", createby);
   ArrayList al = new ArrayList();
   for (Iterator i = query.iterate(); i.hasNext();) {
    cargo cargo1 = (cargo) i.next();
    al.add(cargo1);
    System.out.println("Cargo ID is:" + cargo1.getId());
   }
   System.out.println("Cargo list is:" + al.size());
   session1.setAttribute("clist", al);
  } catch (Exception e) {
   e.printStackTrace();
   return mapping.findForward("failure");
  }
  System.out.println("search Cargo list is success");

  return mapping.findForward("success");
 }




 public ActionForward edit(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  SessionFactory sessionFactory=null;
  Session session =null;
  if (log.isDebugEnabled()) {
   log.debug("Entering Master Edit method");
  }

  try {
   sessionFactory = (SessionFactory) servlet
     .getServletContext().getAttribute(HibernatePlugIn.KEY_NAME);
   session = sessionFactory.openSession();
   Transaction transaction=session.beginTransaction();
   cargoForm carForm = (cargoForm) form;
   // System.out.println(carForm.getStatus());
   // System.out.println(carForm.getCreate());
   cargo cargo = new cargo();
   BeanUtils.copyProperties(cargo, carForm);
      System.out.println("In Cargo Edit "+cargo.getId());
      String qstring = "from cargo c where c.id=:id";
   Query query = session.createQuery(qstring);
   query.setParameter("id", cargo.getId());
   ArrayList all = new ArrayList();
   cargo c = (cargo) query.iterate().next();

   System.out.println("Edit Cargo list " + all.size()); 


     Set purchaseArray = new HashSet();
           System.out.println("Edit"+c.getItemList().size());
           carForm.setItemDtl(purchaseArray);
           BeanUtils.copyProperties(carForm,c);
           // transaction.commit();
            session.flush();
  } catch (Exception e) {
   e.printStackTrace();
   return mapping.findForward("failure");
  }

  // return a forward to edit forward
  System.out.println("Edit Cargo list is success");
  return mapping.findForward("succ");
 }

 public ActionForward delete(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {

  try {
   SessionFactory sessionFactory = (SessionFactory) servlet
     .getServletContext().getAttribute(HibernatePlugIn.KEY_NAME);
   Session session = sessionFactory.openSession();
   Transaction tx = session.beginTransaction();
   cargoForm carForm = (cargoForm) form;
   // System.out.println(carForm.getStatus());
   // System.out.println(carForm.getCreate());
   cargo cargo = new cargo();
   BeanUtils.copyProperties(cargo, carForm);
      System.out.println("In Cargo Delete "+cargo.getId());
   //String qstring = "delete from cargo c where c.id=:id";
   //Query query = session.createQuery(qstring);
   session.delete("cargo",cargo);
     // session.delete(cargo);
     // session.flush();
   //query.setParameter("id", cargo.getId());
   //int row=query.executeUpdate();
   //System.out.println("deleted row"+row);
   tx.commit();

  } catch (Exception e) {
   e.printStackTrace();
   return mapping.findForward("failure");
  }
  // return a forward to edit forward
  System.out.println("Deleted success");
  return mapping.findForward("succes");
 }

}

My parent model

我的父模型

package com.model;

import java.util.HashSet;
import java.util.Set;

public class cargo {

 private Long id;
 private String cname;
 private String cdate;
 private String csource;
 private String cdestination;
 private String create;
 private String status;

 private Set itemList = new HashSet();

 public Long getId() {
  return id;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public String getCname() {
  return cname;
 }

 public void setCname(String cname) {
  this.cname = cname;
 }

 public String getCdate() {
  return cdate;
 }

 public void setCdate(String cdate) {
  this.cdate = cdate;
 }

 public String getCsource() {
  return csource;
 }

 public void setCsource(String csource) {
  this.csource = csource;
 }

 public String getCdestination() {
  return cdestination;
 }

 public void setCdestination(String cdestination) {
  this.cdestination = cdestination;
 }

 public String getCreate() {
  return create;
 }

 public void setCreate(String create) {
  this.create = create;
 }

 public String getStatus() {
  return status;
 }

 public void setStatus(String status) {
  this.status = status;
 }

 public Set getItemList() {
  return itemList;
 }

 public void setItemList(Set itemList) {
  this.itemList = itemList;
 }


}  

My child model

我的孩子模型

package com.model;

public class Item{

 private Long itemid;
 private String itemName;
 private String weight;
 private cargo cargo;

 public Long getItemid() {
  return itemid;
 }
 public void setItemid(Long itemid) {
  this.itemid = itemid;
 }
 public String getItemName() {
  return itemName;
 }
 public void setItemName(String itemName) {
  this.itemName = itemName;
 }
 public String getWeight() {
  return weight;
 }
 public void setWeight(String weight) {
  this.weight = weight;
 }
 public cargo getCargo() {
  return cargo;
 }
 public void setCargo(cargo cargo) {
  this.cargo = cargo;
 }


} 

And my form

还有我的表格

package com.form;

import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

import com.model.Item;

public class cargoForm extends ActionForm {
 private Long id;
 private String cname;
 private String cdate;
 private String csource;
 private String cdestination;
 private String create;
 private String status;

 private Long[] itemid;
 private String[] itemName;
 private String[] weight;

 private Set itemset = new HashSet();

 public Long getId() {
  return id;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public String getCname() {
  return cname;
 }

 public void setCname(String cname) {
  this.cname = cname;
 }

 public String getCdate() {
  return cdate;
 }

 public void setCdate(String cdate) {
  this.cdate = cdate;
 }

 public String getCsource() {
  return csource;
 }

 public void setCsource(String csource) {
  this.csource = csource;
 }

 public String getCdestination() {
  return cdestination;
 }

 public void setCdestination(String cdestination) {
  this.cdestination = cdestination;
 }

 public String getCreate() {
  return create;
 }

 public void setCreate(String create) {
  this.create = create;
 }

 public String getStatus() {
  return status;
 }

 public void setStatus(String status) {
  this.status = status;
 }

 public Long[] getItemid() {
  return itemid;
 }

 public void setItemid(Long[] itemid) {
  this.itemid = itemid;
 }

 public String[] getItemName() {
  return itemName;
 }

 public void setItemName(String[] itemName) {
  this.itemName = itemName;
 }

 public String[] getWeight() {
  return weight;
 }

 public void setWeight(String[] weight) {
  this.weight = weight;
 }

 /*
  * public Set getItemset() { return itemset; }
  * 
  * public void setItemset(Set itemset) { this.itemset = itemset; }
  */
 public Set getItemDtl() {
  if (itemid != null) {
   itemset = new HashSet();
   System.out.println("cargadd form" + itemid);
   for (int i = 0; i < itemid.length; i++) {
    Item it = new Item();
    // it.setItemId(itemId[i]);
    it.setItemName(itemName[i]);
    System.out.println("cargadd form" + itemName[i]);
    it.setWeight(weight[i]);

    itemset.add(it);
    System.out.println("cargadd form" + itemset.size());
   }
  }
  return itemset;
 }

 public void setItemDtl(Set itemset) {
  System.out.println("cargadd form" + itemset.size());
  this.itemset = itemset;
  System.out.println("cargadd form" + itemset.size());
 }

 public void reset(ActionMapping mapping, HttpServletRequest request) {

  cname = "";
  csource = "";
  cdestination = "";
  cdate = "";
  status = "";
  create = "";

 }

}

The error:

错误:

Hibernate: select max(itemid) from item
Hibernate: insert into item (itemname, weight, position, id, itemid) values (?, ?, ?, ?, ?)
Hibernate: update cargo set name=?, date=?, source=?, destination=?, createby=?, status=? where id=?
Oct 4, 2010 10:44:08 AM org.hibernate.jdbc.BatchingBatcher doExecuteBatch
SEVERE: Exception executing batch: 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
 at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
 at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
 at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
 at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
 at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
 at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
 at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
 at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
 at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
 at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
 at com.action.CargoAction.save(CargoAction.java:125)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
 at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
 at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
 at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
 at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
 at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
 at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
 at java.lang.Thread.run(Unknown Source)
Oct 4, 2010 10:44:08 AM org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
 at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
 at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
 at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
 at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
 at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
 at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
 at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
 at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
 at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
 at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
 at com.action.CargoAction.save(CargoAction.java:125)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
 at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
 at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
 at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
 at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
 at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
 at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
 at java.lang.Thread.run(Unknown Source)
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
 at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
 at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
 at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
 at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
 at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
 at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
 at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
 at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
 at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
 at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
 at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
 at com.action.CargoAction.save(CargoAction.java:125)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
 at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
 at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
 at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
 at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
 at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
 at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
 at java.lang.Thread.run(Unknown Source)

回答by Raghuram

It looks like, cargocan have one or more item. Each item would have a reference to its corresponding cargo.

看起来,cargo可以有一个或多个item。每个项目都将引用其相应的cargo.

From the log, itemobject is insertedfirst and then an attempt is made to updatethe cargoobject (which does not exist).

从日志,item对象被插入第一和然后试图到更新cargo对象(不存在)。

I guess what you actually want is cargoobject to be created first and then the itemobject to be created with the idof the cargo object as the reference - so, essentally re-look at the save() method in the Actionclass.

我猜你真正想要的是cargo先创建对象,然后item以货物对象的id作为引用创建对象 - 所以,本质上重新看看Action类中的save() 方法。

回答by M.J.

It looks like, when you try to delete the same object and then again update the same object, then it gives you this error. As after every update hibernate for safe checking fires how many rows were updated, but during the code the data must have been deleted. Over here hibernate distinguish between the objects based on the key what u have assigned or the equals method.

看起来,当您尝试删除同一个对象然后再次更新同一个对象时,它会给您这个错误。在每次更新后,为了安全检查休眠会触发更新了多少行,但在代码期间,数据必须已被删除。在这里,hibernate 根据您分配的键或 equals 方法区分对象。

so, just go through once through your code for this check, or try with implementing equals & hashcode method correctly which might help.

因此,只需通过您的代码进行一次检查,或者尝试正确实现 equals & hashcode 方法,这可能会有所帮助。

回答by srinivasulu p

In the Hibernate mapping file for the idproperty, if you use any generator class, for that property you should not set the value explicitly by using a setter method.

id属性的 Hibernate 映射文件中,如果您使用任何生成器类,则不应使用 setter 方法显式设置该属性的值。

If you set the value of the Id property explicitly, it will lead the error above. Check this to avoid this error.

如果显式设置Id属性的值,会导致上面的错误。检查此项以避免此错误。

回答by joel

/*
* Thrown when a version number or timestamp check failed, indicating that the
* Session contained stale data (when using long transactions with versioning). 
* Also occurs if we try delete or update a row that does not exist.
*
*/

if ( expectedRowCount > rowCount ) {
   throw new StaleStateException(           
  "Batch update returned unexpected row count from update [" + batchPosition +"]; actual row count: " + rowCount +"; expected: " + expectedRowCount);
   }

<property name="show_sql">true</property>This should show you the SQL that is executed and causes the problem.

<property name="show_sql">true</property>这应该向您显示已执行并导致问题的 SQL。

*The StaleStateException would be thrown only after we successfully deleted one object, and then tried to delete another. The reason for this is, while persisting the objects across sessions, objects must first be deleted from the Session before deleted. Otherwise, subsequent deletes will cause the StaleStateExceptionto be thrown.

*只有在我们成功删除一个对象,然后尝试删除另一个对象后,才会抛出 StaleStateException。这样做的原因是,在跨会话持久化对象时,必须先从会话中删除对象,然后才能删除。否则,后续删除将导致 StaleStateException抛出 。

 Session.Remove(obj); 
 objectDAO.Delete(obj);

*The problem was that a table must have only one field that is primary key (I had a composite key and this is not a good idea, except for the many to many relation). I have solved using a new id table field auto incremental.

*问题是一张表必须只有一个主键字段(我有一个复合键,这不是一个好主意,除了多对多关系)。我已经解决了使用新的 id 表字段自动增量。

*It can be fix by using Hibernate session.update()-- you need to have the table/view's primary key equal your corresponding bean property (eg. id).

*它可以通过使用来修复Hibernate session.update()——你需要让表/视图的主键等于你对应的 bean 属性(例如 id)。

*

*

回答by Sumit Singh

its happen when you try to delete the same object and then again update the same object use this after delete

当您尝试删除同一个对象然后再次更新同一个对象时会发生这种情况,请在删除后使用它

session.clear();

回答by Muhammad Suleman

what i have experienced is that this exception raise when updating object have an id which not exist in table. if you read exception message it says "Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1" which means it was unable to found record with your given id.

我所经历的是,当更新对象具有表中不存在的 id 时会引发此异常。如果您阅读异常消息,它会显示“批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1”,这意味着它无法找到具有您给定 ID 的记录。

To avoid this i always read record with same id if i found record back then i call update otherwise throw "exception record not found".

为了避免这种情况,如果我找到记录,我总是读取具有相同 ID 的记录,然后我调用更新,否则抛出“未找到异常记录”。

回答by Emrah Denizer

I had the same as well.Making the Id (0) doing "(your Model value).setId(0)" solved my problem.

我也有同样的情况。让 Id (0) 做“(你的模型值)。setId(0)”解决了我的问题。

回答by manjunath

if The given id is not exist in the DB ,then you may get this exception.

如果数据库中不存在给定的 id,那么您可能会收到此异常。

Exception in thread "main" org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

回答by Blanford Robinson

This often happens when your SQL is bad (implicit type conversions etc.).

当您的 SQL 不好(隐式类型转换等)时,通常会发生这种情况。

Turn on hibernate SQL logging by adding the following lines to your log4j properties file:

通过将以下行添加到 log4j 属性文件来打开休眠 SQL 日志记录:

logs the SQL statements

记录 SQL 语句

log4j.logger.org.hibernate.SQL=debug

log4j.logger.org.hibernate.SQL=调试

Logs the JDBC parameters passed to a query

记录传递给查询的 JDBC 参数

log4j.logger.org.hibernate.type=trace

log4j.logger.org.hibernate.type=trace

Before failing you will see the last SQL statement attempted in your log, copy and paste this SQL into an external SQL client and run it.

在失败之前,您将在日志中看到最后一次尝试的 SQL 语句,将此 SQL 复制并粘贴到外部 SQL 客户端并运行它。

回答by user7260064

For update()and saveOrUpdate()methods, idgenerator value should be there in the database. For the save()method, idgenerator is not required.

对于update()saveOrUpdate()方法,id生成器值应该在数据库中。对于该save()方法,id不需要生成器。