web-dev-qa-db-fra.com

org.hibernate.StaleStateException: la mise à jour par lot a renvoyé un nombre de lignes inattendu à partir de update [0]; nombre actuel de lignes: 0; attendu: 1

Je me sers de jambes de force et d'hibernation. J'ai une relation parent-enfant utilisant set in hbm . Dans l'action, j'utilise la méthode session.saveOrUpdate() pour enregistrer, mais lors de la sauvegarde, l'erreur ci-dessous est affichée. Quelqu'un peut-il aider à expliquer ceci avec une explication où j'ai commis l'erreur?

Voici mon 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>

Mon 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");
 }

}

Mon modèle parent

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;
 }


}  

Mon modèle d'enfant 

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;
 }


} 

Et ma forme

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 = "";

 }

}

L'erreur:

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)
26
subbu

Dans le fichier de mappage Hibernate de la propriété id, si vous utilisez une classe de générateur, vous ne devez pas définir explicitement la valeur à l'aide de la méthode setter.

Si vous définissez explicitement la valeur de la propriété Id, l'erreur ci-dessus sera générée. Cochez cette option pour éviter cette erreur.

46
srinivasulu p

cela se produit lorsque vous essayez de supprimer le même objet, puis de le mettre à jour à nouveau utilisez-le après la suppression 

session.clear();
14
Sumit Singh

ce que j'ai expérimenté, c'est que cette exception se déclenche lors de la mise à jour d'un objet ayant un identifiant qui n'existe pas dans la table. si vous lisez le message d'exception, il indique "La mise à jour par lot a renvoyé un nombre inattendu de lignes à partir de la mise à jour [0]; nombre réel de lignes: 0; attendu: 1", ce qui signifie qu'il n'a pas été possible de trouver un enregistrement avec votre identifiant donné.

Pour éviter cela, je lis toujours un enregistrement avec le même identifiant si je trouve un enregistrement, puis j’appelle update, sinon jette "enregistrement d’exception introuvable".

3
Muhammad Suleman
/*
* 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> Cela devrait vous montrer le SQL qui est exécuté et provoque le problème.

* L'exception StaleStateException ne serait levée qu'après avoir supprimé avec succès un objet, puis essayé d'en supprimer un autre. La raison en est que, tout en conservant les objets entre les sessions, les objets doivent d'abord être supprimés de la session avant d'être supprimés. Sinon, les suppressions ultérieures provoqueront le lancement de la StaleStateException

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

* Le problème était qu'une table ne doit avoir qu'un seul champ qui est une clé primaire (j'avais une clé composite et ce n'est pas une bonne idée, à l'exception de la relation plusieurs à plusieurs). J'ai résolu en utilisant un nouveau champ de table d'ID auto incrémental.

* Cela peut être résolu en utilisant Hibernate session.update() - vous devez que la clé primaire de la table/vue soit égale à votre propriété de bean correspondante (par exemple, id).

*

1
joel

Pour les méthodes update() et saveOrUpdate(), la valeur du générateur id devrait figurer dans la base de données. Pour la méthode save(), le générateur id n'est pas requis. 

1
user7260064

Comme mentionné ci-dessus, veillez à ne pas définir de champs d'identification supposés être générés automatiquement.

Pour causer ce problème lors des tests, assurez-vous que la base de données "voit", dit aussi, purge ce SQL, sinon tout peut sembler bien alors que ce n’est vraiment pas le cas.

J'ai rencontré ce problème lors de l'insertion de mon parent avec un enfant dans la base de données:

  1. Insérer le parent (avec ID manuel)
  2. Insérer un enfant (avec ID généré automatiquement)
  3. Mettre à jour la clé étrangère dans la table enfant au parent.

La 3. déclaration a échoué. En effet, l'entrée avec l'ID généré automatiquement (par Hibernate) n'était pas dans la table car un déclencheur a modifié l'ID à chaque insertion, laissant ainsi la mise à jour échouer sans qu'aucune ligne correspondante ne soit trouvée.

Etant donné que la table peut être mise à jour sans aucun serveur Hibernate, j'ai ajouté une vérification pour déterminer si l'ID est nul et ne la remplissez que pour le déclencheur.

1
secure_paul

Il semble que lorsque vous essayez de supprimer le même objet, puis de le mettre à jour à nouveau, vous obtenez alors cette erreur. Comme après chaque mise à jour, l'hibernation pour une vérification en toute sécurité déclenche le nombre de lignes mises à jour, mais au cours du code, les données doivent avoir été supprimées. Hibernate distingue ici les objets en fonction de la clé que vous avez attribuée ou de la méthode equals. 

alors, parcourez votre code une seule fois pour cette vérification, ou essayez d’appliquer correctement la méthode equals & hashcode, ce qui pourrait aider.

1
M.J.

cargo peut avoir une ou plusieurs item. Chaque élément aurait une référence à sa cargo correspondante.

Dans le journal, l'objet item est d'abord insert, puis une tentative est faite pour mettre à jour l'objet cargo (qui n'existe pas). 

Je suppose que ce que vous voulez réellement, c’est que l’objet cargo soit créé en premier, puis que l’objet item soit créé avec le id de l’objet cargo comme référence - donc, il est essentiel de réexaminer le save ( ) dans la classe Action.

1
Raghuram

Donc, pour mon cas, j'ai remarqué que Hibernate essayait de mettre à jour l'enregistrement plutôt que de l'insérer et que l'exception levée était lancée.

J'ai finalement découvert que mon entité avait une colonne timestamp updatedAt:

<timestamp name="updatedDate" column="updated_date" />

et quand j’essayais d’initialiser l’objet, j’ai trouvé que le code était définissant ce champ explicitement. 

après la suppression de setUpdateDate (new Date ()), cela a fonctionné et une insertion a été effectuée.

0
Bashar Ali Labadi

Cela se produit souvent lorsque votre code SQL est incorrect (conversions de type implicite, etc.). 

Activez la journalisation SQL en veille prolongée en ajoutant les lignes suivantes à votre fichier de propriétés log4j:

enregistre les instructions SQL

log4j.logger.org.hibernate.SQL = debug

Journalise les paramètres JDBC transmis à une requête

log4j.logger.org.hibernate.type = trace

Avant d’échouer, vous verrez la dernière instruction SQL tentée dans votre journal, copiez et collez ce SQL dans un client SQL externe et exécutez-le. 

0
Blanford Robinson

s'il vous plaît, ne définissez pas l'identifiant de la classe enfant qui est la classe du générateur n'est étranger que le réglage de l'identifiant de la classe parent si votre identifiant de la classe parent est attribué .... $. être fixe ..... définitivement .

0
r.jatt

J'ai eu la même chose aussi. Faire l'Id (0) faire "(votre valeur de modèle) .setId (0)" a résolu mon problème 

0
Emrah Denizer