Hibernate 报:Exception executing batch 和 Batch update returned unexpected row count from update: 0 actual row count: 0 expecte

yxxcrtd 2007-04-19 08:19:50
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)
...全文
11810 44 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
dragon08 2010-12-13
  • 打赏
  • 举报
回复
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);

}
xxlsuperman 2009-09-18
  • 打赏
  • 举报
回复
原因就是 因为你要update 的那一条数据,在数据库中没有找到(根据主键找不到数据)。 就这么简单,没他们说的那么吓人~~!
leehonglim 2008-12-10
  • 打赏
  • 举报
回复
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
clearskyer 2008-07-10
  • 打赏
  • 举报
回复
这个问题我遇到过,和MYSQL的版本问题什么的没有任何关系,我错误的原因是在从页面向后台传递信息的时候没有将对象的 主键 传递回来造成HIBERNATE无法根据主键对数据进行更新
wddodo 2008-01-15
  • 打赏
  • 举报
回复
粗心大意,我也犯了同样的错误,找了很久终于在本帖找到了答案,谢谢各位了。
telloo7608 2007-11-14
  • 打赏
  • 举报
回复
majkandy 2007-04-22
  • 打赏
  • 举报
回复
太....试试把
<id name="AutoID" column="AutoID" type="java.lang.Integer" unsaved-value="null">
<generator class="native" />
</id>
在update前把你要update的对象加载到session一级缓存管理之内,通过session.load()一下试试,因为你的id有可能是0
「已注销」 2007-04-20
  • 打赏
  • 举报
回复
?
genius_mcx 2007-04-20
  • 打赏
  • 举报
回复
所以我努力让自己不带星星
v38 2007-04-20
  • 打赏
  • 举报
回复
既然本人的贴子成了头条,偶就插播个广告吧:
本人在苏州两年开发经验,熟练使用Hibernate+spring+struts ,英语口语相当流利,因为女朋友在上海工作,打算最近去上海发展,有意者联系:
QQ:8781835
MSN:v38@163.com

版主不要给偶删了啊:)
v38 2007-04-20
  • 打赏
  • 举报
回复
晕,这个贴子还能成为头条推荐?
edmond80 2007-04-20
  • 打赏
  • 举报
回复

<id name="AutoID" column="AutoID" type="java.lang.Integer" unsaved-value="null">
<generator class="assigned" />
</id>

中的<generator class="assigned" />

改为<generator class="identity" />

试试

我的项目中,自动增长主键就是这么配的。数据库同样是MSSQL。
v38 2007-04-19
  • 打赏
  • 举报
回复
怎么会是 0 ?
========================================
0是你自已做参数传进来的,别人怎么回答呢?
csdn里面带星的会员尚且如此对待问题,真的没办法在CSDN混了
「已注销」 2007-04-19
  • 打赏
  • 举报
回复
哈哈,我现在知道了!

我现在将取出的对象 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
v38 2007-04-19
  • 打赏
  • 举报
回复
怎么会是 0 ?
========================================
我第一贴子就给你说,问题一定是出在这里,至于怎么会是0,你要自已找了,从你那个待久化对象被取出来的时候开始
早就说是这个问题,却一直不去找原因,唉~你咋就不听呢
greatzheng 2007-04-19
  • 打赏
  • 举报
回复
关注
「已注销」 2007-04-19
  • 打赏
  • 举报
回复
怎么会是 0 ?
v38 2007-04-19
  • 打赏
  • 举报
回复
session.update(obj);
那你在obj之前,调用一下System.out.print(obj.getAutoId());
看看打印出来的是什么
问题一定是出在这里
「已注销」 2007-04-19
  • 打赏
  • 举报
回复
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)
「已注销」 2007-04-19
  • 打赏
  • 举报
回复
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);
}
}
加载更多回复(22)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧