ERROR [http-8080-Processor22] (BatchingBatcher.java:60) - 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.BatchingBatcher.checkRowCount(BatchingBatcher.java:92)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:78)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:284)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:736)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:330)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at dao.BaseDAO.mdfObj(BaseDAO.java:72)
at action.CsdjAction.update(CsdjAction.java:51)
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:274)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1192)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:430)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at action.EncodingFilter.doFilter(EncodingFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)

解决方案 »

  1.   

    主要的错误为:ERROR [http-8080-Processor22] (BatchingBatcher.java:60) - Exception executing batch: 
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
    ...
    ...
    ERROR [http-8080-Processor22] (AbstractFlushingEventListener.java:287) - 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大家看看是什么问题? 谢谢!!!
      

  2.   

    我是一条记录的 update 操作的跟踪到 事务提交 的的时候就报错了:
    try
    {
    session = HibernateUtil.currentSession();
    tx = session.beginTransaction(); System.out.println("==== 开始 update 操作 ====");
    session.update(obj);

    System.out.println("====== 结束 update 操作 ======");
    tx.commit();

    System.out.println("======== 提交事务 ========");
    }
    ==== 开始 update 操作 ====
    ====== 结束 update 操作 ======
    Hibernate: update Csdj_table set dah=?, brxm=?, brsfzh=?, brgzdw=?, brzwzc=?, brzt1=?, brzt2=?, poxm=?, posfzh=?, pogzdw=?, pozwzc=?, pozt1=?, pozt2=?, qxbm=?, fwzl=?, gryy=?, cqzh=?, ycqdw=?, ssxt=?, dwxz=?, jzmj=?, hdmj=?, sfcb=?, ydmr=?, cbcl=?, hdqk=?, msrxm=?, msrsfzh=?, cje=?, bz=?, shrq=?, csrq=?, yt=?, Pc=?, sjly=?, dwbm=?, zjgs=?, jyzt=? where AutoID=?
    ERROR [http-8080-Processor24] (BatchingBatcher.java:60) - 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.BatchingBatcher.checkRowCount(BatchingBatcher.java:92)
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:78)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:284)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:736)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:330)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
    at dao.BaseDAO.mdfObj(BaseDAO.java:75)
    at action.CsdjAction.update(CsdjAction.java:51)
    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:274)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1192)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:430)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at action.EncodingFilter.doFilter(EncodingFilter.java:46)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Unknown Source)
    ERROR [http-8080-Processor24] (AbstractFlushingEventListener.java:287) - 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.BatchingBatcher.checkRowCount(BatchingBatcher.java:92)
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:78)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:284)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:736)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:330)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
    at dao.BaseDAO.mdfObj(BaseDAO.java:75)
    at action.CsdjAction.update(CsdjAction.java:51)
    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)
      

  3.   

    没有打出 System.out.println("======== 提交事务 ========");
      

  4.   

    我遇到过一次差不多的问题,但不一定和你这个一样.
    当时找到的原话是:
    The JDBC driver is telling Hibernate that it did not update any rows as a result of Hibernate's INSERT or UPDATE. Hibernate reasonably enough thinks that this cannot be correct.
    注意unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是 persistence object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。
    你可以Debug跟一下你的代码,看看在
    session.update(obj);
    的时候,obj的主键的值是不是按你定义的那样,obj可以被hibernate认为是一个已经持久化在数据库里的对象
      

  5.   

    也就是,在你UPDATE操作的时候,你的要更新的对象的主键可能是null或unsaved-value的值了.
      

  6.   

    我用 
    System.out.println("==== 开始 update 操作 ====");
    session.update(obj);
    System.out.println("====== 结束 update 操作 ======");

    tx.commit();

    System.out.println("======== 提交事务 ========");
    没打出:没有打出 System.out.println("======== 提交事务 ========");
      

  7.   

    个人觉得v38说的有道理,你首先要看看你更新的数据是否符合你数据库的要求。错误提示中告诉你更新失败。JDBC每个update操作都返回的是这次操作所影响的记录数。你的程序运行过程中hibernate认为应该返回1,但是实际运行中返回的却是0,说明更新失败
      

  8.   

    数据库是 SQLServer,表的主键是 AutoID ,不是 自增长 类型的,我在 .hbm.xml 文件中是这样定义的:<id name="AutoID" column="AutoID" type="java.lang.Integer" unsaved-value="null">
      <generator class="assigned" />
    </id>
      

  9.   

    我连接数据库用的是 jtds.jar ,难道与这有关? 应该不会。
      

  10.   

    我怀疑错误在这里
    <id name="AutoID" column="AutoID" type="java.lang.Integer" unsaved-value="null">
      <generator class="assigned" />
    </id>
      

  11.   

    我的 unsaved-value="null"  改成 unsaved-value="0" 也是不行...
      

  12.   

    你Debug跟一下你的代码,看看在
    session.update(obj);
    的时候,obj的主键的值
    然后再找解决方案
      

  13.   

    xml配置应该没有问题,问题在于你写的这个Csdj_table类.
    类写法不一样就会跟这个提交出错有关.
      

  14.   

    我在Action 中用 BeanUtil.copyproperits()来把值从form中加载到pojo对象中,
    在保存这个pojo时,调用 Update()方法来持久化。我的 Csdj_table类 是一个 pojo 和 pojoFrom ,这两个类唯一的区别就是:
     pojoForm 类是
    ...
    import org.apache.struts.action.ActionForm;
    public class CsdjForm extends ActionForm
    {
    ...
    }
    ...pojo 类是:public class Csdj
    {
        public Csdj()
        {
         //无参的构造函数
        }
    ...
    }其他的 get 和 set 都一样
      

  15.   

    AbstractCsdj_table.javaimport java.io.Serializable;public abstract class AbstractCsdj_table() implements Serializable {
        private java.lang.Integer autoid;    public AbstractCsdj_table() {
        }    public AbstractCsdj_table(java.lang.Integer autoid) {
            this.setAutoid(autoid);
        }    public void setAutoid(java.lang.Integer autoid) {
            this.autoid = autoid;
        }    public java.lang.Integer getAutoid() {
            return this.autoid;
        }
    }Csdj_table.javaimport java.io.Serializable;public class Csdj_table extends AbstractCsdj_table implements Serializable {
        private static final long serialVersionUID = 1L;    public Csdj_table() {
        }    public Csdj_table(java.lang.Integer autoid) {
            super(autoid);
        }
    }
    我是这样写的,没有遇见过你那种错误.
      

  16.   

    你Debug跟一下你的代码,看看在
    session.update(obj);
    的时候,obj的主键的值
    然后再找解决方案
    ==============================================
    我的建议你都不听,我没活可说了~~~~~~~~~~
      

  17.   

    TO:v38一直在调试!不好意思我修改了 mdyObj 方法:
    public static void mdfObj(Object obj)
    {
    Transaction tx = null;
    Session session = null;
    try
    {
    session = HibernateUtil.currentSession();
    tx = session.beginTransaction(); System.out.println("==== 开始 update 操作 ====");

    session.update(obj);

    System.out.println("====== 结束 update 操作 ======");

    session.flush();  // 报错后加的
    session.clear();  // 报错后加的

    tx.commit();

    System.out.println("======== 提交事务 ========");
    }
    catch (HibernateException e)
    {
    e.printStackTrace();
    tx.rollback();
    }
    finally
    {
    HibernateUtil.closeSession(session);
    }
    }
      

  18.   

    id 改成 identity 还是:Hibernate: update Csdj_table set dah=?, brxm=?, brsfzh=?, brgzdw=?, brzwzc=?, brzt1=?, brzt2=?, poxm=?, posfzh=?, pogzdw=?, pozwzc=?, pozt1=?, pozt2=?, qxbm=?, fwzl=?, gryy=?, cqzh=?, ycqdw=?, ssxt=?, dwxz=?, jzmj=?, hdmj=?, sfcb=?, ydmr=?, cbcl=?, hdqk=?, msrxm=?, msrsfzh=?, cje=?, bz=?, shrq=?, csrq=?, yt=?, Pc=?, sjly=?, dwbm=?, zjgs=?, jyzt=? where AutoID=?
    ERROR [http-8080-Processor24] (AbstractFlushingEventListener.java:287) - Could not synchronize database state with session
    org.hibernate.HibernateException: Unexpected row count: 0 expected: 1
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:32)
      

  19.   

    session.update(obj); 
    那你在obj之前,调用一下System.out.print(obj.getAutoId());
    看看打印出来的是什么
    问题一定是出在这里
      

  20.   

    哈哈,我现在知道了!我现在将取出的对象 set 了一次...    public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
        {
         CsdjForm csdj_vo = (CsdjForm) form;
        
         Csdj csdj_po = new Csdj();
        
            BeanUtils.copyProperties(csdj_po, csdj_vo);        csdj_po.setAutoID(csdj_vo.AutoID);
            CsdjDAO.mdfObj(csdj_po);  
            
            return list(mapping, form, request, response);
        }然后用:
    public static void mdfObj(Object obj)
    {
    Transaction tx = null;
    Session session = null;
    try
    {
    session = HibernateUtil.currentSession();
    tx = session.beginTransaction(); System.out.println("==== 开始 update 操作 ====");
    System.out.println(((Csdj) obj).getAutoID());
    session.update(obj);

    System.out.println("====== 结束 update 操作 ======");

    session.flush();
    session.clear();

    tx.commit();
    System.out.println("======== 提交事务 ========");
    }
    catch (HibernateException e)
    {
    e.printStackTrace();
    tx.rollback();
    }
    finally
    {
    HibernateUtil.closeSession(session);
    }
    }打出还是 0
      

  21.   

    怎么会是 0 ?
    ========================================
    0是你自已做参数传进来的,别人怎么回答呢?
    csdn里面带星的会员尚且如此对待问题,真的没办法在CSDN混了
      

  22.   


    <id name="AutoID" column="AutoID" type="java.lang.Integer" unsaved-value="null">
      <generator class="assigned" />
    </id>中的<generator class="assigned" />改为<generator class="identity" />试试我的项目中,自动增长主键就是这么配的。数据库同样是MSSQL。
      

  23.   

    既然本人的贴子成了头条,偶就插播个广告吧:
    本人在苏州两年开发经验,熟练使用Hibernate+spring+struts ,英语口语相当流利,因为女朋友在上海工作,打算最近去上海发展,有意者联系:
    QQ:8781835 
    MSN:[email protected]版主不要给偶删了啊:)
      

  24.   

    太....试试把
    <id name="AutoID" column="AutoID" type="java.lang.Integer" unsaved-value="null">
      <generator class="native" />
    </id>
    在update前把你要update的对象加载到session一级缓存管理之内,通过session.load()一下试试,因为你的id有可能是0
      

  25.   

    这个问题我遇到过,和MYSQL的版本问题什么的没有任何关系,我错误的原因是在从页面向后台传递信息的时候没有将对象的 主键 传递回来造成HIBERNATE无法根据主键对数据进行更新
      

  26.   

    update by id
    if(id==0)
       org.hibernate.StaleStateException:   Batch   update   returned   unexpected   row   count   from   update:   0   actual   row   count:   0   expected:   1 else
       success
      

  27.   

    原因就是 因为你要update 的那一条数据,在数据库中没有找到(根据主键找不到数据)。  就这么简单,没他们说的那么吓人~~!
      

  28.   

    public   static   void   mdfObj(int AutoID,Object   obj) 

    Transaction   tx   =   null; 
    Session   session   =   null; 
    try 

    session   =   HibernateUtil.currentSession(); 
    tx   =   session.beginTransaction(); obj.setAutoID(AutoID);//update前set一下id就可以啦System.out.println( "====   开始   update   操作   ==== "); 
    System.out.println(((Csdj)   obj).getAutoID()); 
    session.update(obj); }