2010-10-04 24 views
24

我正在使用struts和hibernate。我有一个使用HBM集的父母和孩子的关系。 在操作中我使用session.saveOrUpdate()方法保存,但保存时显示下面的错误。任何人都可以帮我解释一下这个错误吗?org.hibernate.StaleStateException:批量更新从update [0]返回意外的行数;实际行数:0;预计:1

这里是我的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> 

我的行动

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


} 

我的形式

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) 

回答

1

它看起来像,cargo可以有一个或多个item。每个项目都会提及其相应的cargo

从日志,item目的是插入第一,然后尝试到更新cargo对象(不存在)制备。

我猜你真正想要的是要创建第一cargo对象,然后将item对象,连同货物对象作为参考的ID创建 - 所以,essentally再看看保存( )方法在行动类。

1

看起来,当你试图删除同一个对象,然后再次更新同一个对象时,它会给你这个错误。在每次更新之后,hibernate会进行安全检查,并触发更新了多少行,但在代码中数据必须已被删除。在这里,hibernate根据你已经分配的关键字或equals方法区分对象。

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

44

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

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

+0

首先在userCredentials.hbm.xml文件I使用的 <发生器类=“同一性”>写下面一个 后问题得到解决。 pudaykiran 2013-02-16 06:29:30

+0

这解决了我的同样的问题,谢谢 – 2013-10-30 04:23:41

+0

谢谢它的作品:) – Prashant 2013-12-24 10:00:00

1
/* 
* 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> 这应该告诉你,被执行,导致问题的SQL。

*仅当我们成功删除了一个对象,然后试图删除另一个对象时,才会引发StaleStateException。原因是,在跨会话持续对象的同时,必须先删除对象之前删除对象。否则,后续的删除将导致StaleStateException被抛出。

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

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

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

*

+1

这是一个写得不好的答案,你可以尝试并更清楚一点吗? – Dutts 2013-02-22 09:23:28

13

它的发生,当您试图删除同样的对象,然后再次更新同一对象 使用这个删除后

session.clear(); 
3

我所经历的是,这个例外加薪更新对象时有一个不存在于表中的ID。如果您读取异常消息,则表示“批量更新返回来自update [0]的意外行数;实际行数:0; expected:1”,这意味着无法使用您的给定ID找到记录。

为了避免这种情况,我总是用相同的id读取记录,如果我发现记录,然后我打电话更新,否则抛出“异常记录未找到”。

0

我也有同样的做法。使Id(0)做“(你的Model值).setId(0)”解决了我的问题。

-2

如果给定的ID在DB中不存在,那么你可能会得到这个异常。

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 
0

这经常发生在你的SQL不好(隐式类型转换等)时。

开启休眠SQL日志中加入以下行到你的log4j的属性文件:

登录SQL语句

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

日志传递给查询的JDBC参数

log4j.logger.org.hibernate.type = trace

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

+0

你应该检查[回答]关于如何更好地表达你的答案的好建议。 – HiDeo 2016-07-11 16:45:34

1

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

0

请不要设置子类的id,它是生成器类只有外部设置父类ID如果您的父类ID已分配... 只是做一件事不要通过setter方法设置孩子类的id你的问题将被修复..... definately

+1

您可能想要添加标点符号,您的答案目前很难阅读。 – mkl 2017-07-27 10:07:49

0

所以对于我的情况,我注意到hibernate正试图更新记录,而不是插入它,并引发异常提到。

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

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

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

删除setUpdateDate(new Date())后,它工作并做了一个插入。

0

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

为了在测试过程中导致这个问题,请确保数据库'看到'aka刷新这个SQL,否则一切看起来都不错。

  1. 插入父(带手动ID)
  2. 插入子(带自动生成的ID)在儿童
  3. 更新外键:

    我的小孩在插入时我父母到数据库遇到了这个问题表到父母。

3.声明失败。事实上,自动生成的ID(通过Hibernate)的条目不在表中,因为触发器在每次插入时都会更改ID,从而导致更新失败,并且找不到匹配的行。

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

相关问题