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); }
这应该显示执行的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时遇到此问题:
- 插入父级(带手册ID)
- 插入子项(具有自动生成的ID)
- 将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
- 使用@MappedSuperclass注释的类上的@SequenceGenerator
- Spring JPA(Hibernate)没有类型的限定bean:javax.persistence.EntityManagerFactory
- Spring hibernate模板列表作为参数
- Hibernate mysql innodb
- Hibernate工具可以生成JPA POJO吗?
- 连接在不活动时间后挂起
- 如何使用Hibernate JPA线程安全进行数据库访问?
- 如何在hibernate中保留实体期间validation实体上的约束
- Hibernate @OneToMany抛出MySQLSyntaxErrorException:您的SQL语法中有错误