2010-10-04 20 views
24

Estoy usando struts e hibernate. Tengo una relación de padres e hijos utilizando el conjunto en hbm. En la acción estoy usando el método session.saveOrUpdate() para guardar, pero al guardarlo aparece el siguiente error. ¿Alguien puede ayudar a considerar esto con una explicación donde cometí el error?org.hibernate.StaleStateException: la actualización por lotes ha devuelto el recuento de filas inesperado de la actualización [0]; recuento de filas real: 0; esperado: 1

Aquí es mi 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> 

Mi acción

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

} 

Mi padre modelo

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


} 

Mi modelo infantil

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


} 

Y mi forma

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

} 

} 

El error:

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

Respuesta

1

Parece que, cargo puede tener uno o más item. Cada artículo tendría una referencia a su correspondiente cargo.

desde el registro, item objeto es inserta primero y luego se hace un intento de actualización la cargo objeto (que no existe).

supongo que lo que realmente quiere es cargo objeto que se ha creado primero y luego el objeto item que ser creado con el Identificación del objeto de carga, según la referencia - así, essentally volver a mirar en el Guardar () método en la clase Acción.

1

Parece que, cuando intenta eliminar el mismo objeto y luego actualiza el mismo objeto, le da este error. Como después de cada actualización, hibernate para comprobar con seguridad el número de filas que se actualizaron, pero durante el código, los datos deben haberse eliminado. Aquí hibernate distinga entre los objetos basados ​​en la clave que ha asignado o el método equals.

Así que, simplemente revise una vez su código para esta comprobación, o intente con la implementación del método de código hash & correctamente, que podría ayudar.

44

En el archivo de mapeo de Hibernate para la propiedad id, si utiliza cualquier clase de generador, para esa propiedad no debe establecer el valor explícitamente utilizando un método setter.

Si establece explícitamente el valor de la propiedad Id, generará el error anterior. Marque esto para evitar este error.

+0

En primer lugar en el archivo userCredentials.hbm.xml Solía ​​ Después escribió debajo de uno se resuelva el problema. pudaykiran

+0

Esto también solucionó mi problema ... gracias –

+0

Gracias, funciona :) – Prashant

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> Esto debería mostrar el SQL que se ejecuta y provoca el problema.

* La excepción StaleStateException se lanzaría solo después de que hayamos eliminado correctamente un objeto y luego haya intentado eliminar otro. La razón de esto es que, mientras se persisten los objetos en las sesiones, los objetos primero deben eliminarse de la sesión antes de eliminarse. De lo contrario, las eliminaciones posteriores provocarán el lanzamiento del StaleStateException.

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

* El problema era que una tabla debe tener sólo un campo que es clave primaria (que tenía una clave compuesta y esto no es una buena idea, a excepción de la relación de muchos a muchos). Lo he resuelto usando un nuevo campo de tabla de identificación auto incremental.

* Se puede reparar utilizando Hibernate session.update() - necesita que la clave principal de la tabla/vista sea igual a la propiedad de su correspondiente bean (por ej., Id).

*

+1

Esta es una respuesta mal escrita, ¿podría intentar y ser un poco más claro? – Dutts

13

su suceder cuando se intenta eliminar el mismo objeto y luego actualizar de nuevo el mismo uso de objetos esto después de eliminar

session.clear(); 
3

lo que he experimentado es que este aumento excepción al actualizar objetos tener una identificación que no existe en la tabla. si lee un mensaje de excepción dice "La actualización por lotes ha devuelto el recuento de filas inesperadas de la actualización [0]; recuento de filas real: 0; esperado: 1", lo que significa que no ha podido encontrar el registro con su id.

Para evitar esto, siempre leo el registro con la misma identificación, si encontré la grabación en ese momento llamé a la actualización, de lo contrario arrojaría "excepción de registro no encontrada".

0

Tuve lo mismo también. Hacer que el Id (0) haciendo "(su valor de modelo) .setId (0)" resolvió mi problema.

-2

si La identificación dada no existe en la base de datos, entonces puede obtener esta excepción.

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

Esto sucede a menudo cuando su SQL es malo (conversiones de tipo implícito, etc.).

activar el registro de hibernación SQL añadiendo las siguientes líneas a sus propiedades log4j archivo:

registra las sentencias SQL

log4j.logger.org.hibernate.SQL = depuración

Registros los parámetros JDBC pasaron a una consulta

log4j.logger.org.hibernate.type = rastreo

Antes de fallar, verá la última instrucción SQL intentada en su registro, copie y pegue este SQL en un cliente SQL externo y ejecútelo.

+0

Debe consultar [respuesta] para obtener buenos consejos sobre cómo presentar mejor su respuesta. – HiDeo

1

Para los métodos update() y saveOrUpdate(), el valor del generador id debe estar allí en la base de datos. Para el método save(), no se requiere el generador id.

0

por favor no establezca el id de la clase secundaria que es la clase del generador es extranjera solo establezca la identificación de la clase padre si su id. De clase primaria está asignada ... simplemente haga una cosa: no establezca la identificación de la clase secundaria a través del método setter; su problema se solucionará ... sin dudas.

+1

Es posible que desee agregar signos de puntuación, su respuesta actualmente es muy difícil de leer. – mkl

0

Por lo tanto, en mi caso noté que hibernate está tratando de actualizar el registro en lugar de insertarlo y que arrojó la excepción mencionada.

Finalmente llegué a descubrir que mi entidad tenía una columna de marca de tiempo updatedAt:

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

y cuando yo estaba tratando de inicializar el objeto me encontré con que el código era establecer este campo de forma explícita.

después de eliminar ese setUpdateDate (new Date()) funcionó e hizo una inserción en su lugar.

0

Como se mencionó anteriormente, asegúrese de no configurar ningún campo de Id. Que se supone que debe generarse automáticamente.

Para causar este problema durante la prueba, asegúrese de que el db 'vea' también descargue este SQL, de lo contrario todo puede parecer bien cuando realmente no lo es.

me encontré con este problema al insertar mi padre con un niño en el PP:

  1. Insertar los padres (con manual ID)
  2. Insertar niño (con autogenerado ID) clave externa
  3. actualización en Child tabla para padres

La instrucción 3. falló. De hecho, la entrada con la ID autogenerada (por Hibernate) no estaba en la tabla, ya que un desencadenador cambió la ID en cada inserción, lo que permitió que la actualización fallara sin encontrar una fila coincidente.

Dado que la tabla se puede actualizar sin ningún Hibernate, agregué un control que indica si el ID es nulo y solo lo llevo y luego al gatillo.

Cuestiones relacionadas