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

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

这是我的hbm.file

                              

我的行动

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

我的父母模特

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

我的孩子模特

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

而我的forms

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

错误:

 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) 

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

如果明确设置Id属性的值,则会导致上述错误。 检查这一点以避免此错误。

当你尝试删除同一个对象然后再次更新同一个对象时,会发生这种情况

 session.clear(); 

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

为了避免这种情况,我总是读取具有相同id的记录,如果我找到记录,那么我调用update,否则抛出“未找到exception记录”。

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

从日志中,首先插入 item对象,然后尝试更新 cargo对象(不存在)。

我想你真正想要的是首先创建cargo对象,然后用货物对象的id作为参考来创建item对象 – 所以,现在重新查看Action类中的save ()方法。

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

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

 /* * 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); } 

true这应该显示执行的SQL并导致问题。

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

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

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

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

*

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

我也一样。做Id(0)做“(你的模型值).setId(0)”解决了我的问题。

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

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

记录SQL语句

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

记录传递给查询的JDBC参数

log4j.logger.org.hibernate.type =跟踪

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

请不要设置子类的id,如果你的父类id被分配,那么生成器类的外部只设置父类id …只做一件事不要通过setter方法设置子类的id你的问题将被解决… ..definately

所以对于我的情况,我注意到hibernate试图更新记录而不是插入它并抛出提到的exception。

我终于发现我的实体有一个updatedAt时间戳列:

  

当我试图初始化对象时,我发现代码明确地设置了这个字段。

在删除setUpdateDate(new Date())之后,它工作并执行了插入操作。

如上所述,请确保您没有设置任何应该自动生成的id字段。

要在测试期间导致此问题,请确保db’看到’也称为刷新此SQL,否则一切看起来都不错,而实际上并非如此。

将带有子节点的父节点插入db时遇到此问题:

  1. 插入父级(带手册ID)
  2. 插入子项(具有自动生成的ID)
  3. 将Child表中的外键更新为父级。

3.声明失败。 实际上,具有自动生成ID(通过Hibernate)的条目不在表中,因为触发器在每次插入时更改了ID,从而使更新失败而没有找到匹配的行。

由于表可以在没有任何Hibernate的情况下进行更新,因此我添加了一个检查ID是否为空并且仅将其填入触发器的情况。

如果DB中不存在给定的id,那么您可能会遇到此exception。

 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