org.hibernate.HibernateException: Unexpected row count: 137 expected: 1
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:33)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2268)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2180)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2450)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:91)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:993)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:340)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:490)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:495)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:468)
at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:258)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
at $Proxy48.saveOrUpdate(Unknown Source)
at com.turbo.cinema.film.UpdateTheaterInfoAction.execute(UpdateTheaterInfoAction.java:343)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.turbo.cinema.common.CharsetEncodFilter.doFilter(CharsetEncodFilter.java:85)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)
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:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:153)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:619)
这个异常是用 hibernate update(obj) 方法报错的, 请问,这个异常是为什么报的!!

解决方案 »

  1.   

    你的obj的Id可能是0,或者是数据库里没有的,因为你update的时候数据库里的数据没找到,就报错了,你调试一下吧,有错就调试啦
      

  2.   

    如果你的object没有save过,就必须要save才行,可以考虑saveOrUpdate(object)
    别外要注意一点就是只有持久化对象(PO)才能update,我们直接new 的一个对象不能update的。
    一般可以这样:
    Query q = session.createQuery("select * from Test where id ='123');
    Test obj = (obj)q.list.get(0);
    obj.setName("chen");
    session.update(obj);
    session.flush();
      

  3.   


    也不是说new出来的对象(新建状态),不能update, 手动指定主键, 然后再进行update也是可以的,只是这样不符合常理而已, 
      

  4.   

    在数据库中没有ID的记录是不能update的
      

  5.   

    在数据库中没有ID的记录是不能update的
      

  6.   

    你数据库都没有这条记录,你想想可以更新吗?你首先保存一条进去,才可以update
      

  7.   


    public void updataTheaterInfo(MTheaterInfo theaterInfo,String oldTheaterCode) throws DatabaseException{
    //log.info("enter getTheaterInfoBySimpleName");
    Session sion = null;
    try{
    sion = this.hibernateTemplate.getSessionFactory().openSession();
    //List list = sion.createQuery("from MTheaterInfo tInfo where isDelete='0' and pingName=:gId").setString("gId",id).list();
    Transaction tr = sion.beginTransaction();
    sion.update(theaterInfo);
    String theaterCode = theaterInfo.getTheaterCode().trim();
    List list = sion.createQuery("from MTheaterHallInfo where theaterCode=:theaterCode").setString("theaterCode",oldTheaterCode).list();
    if (list.size() > 0){
    for (int i = 0 ; i < list.size();i++){
    MTheaterHallInfo hall = (MTheaterHallInfo)list.get(i);
    hall.setTheaterCode(theaterCode);
    String hallNum = hall.getNumberHall().substring(hall.getNumberHall().trim().length()-2);
    hall.setNumberHall(theaterCode.substring(0,10) + hallNum);
    sion.update(hall);
    }
    }
    tr.commit();这一处报的异常,update(obj)没报异常
    //sion.close();


    }catch(Exception ex){
    ex.printStackTrace();

    }finally{
    if (sion != null){
    sion.close();
    }
    }
    }
    我去查了一下数据库,原因是我在这个表M_TheaterHallInfo中 建立一个触发器,create trigger m_theaterinfo_piaofangxs on m_theaterinfo 
    for update
    as
    if update(piaofangxs)
    begin
    update m_mantianxing set income=incomesum*i.piaofangxs*(mtx.bili/100) from
    m_mantianxing mtx,inserted i,m_theaterinfo mt where mtx.theatercode=mt.theatercode
    and mtx.theatercode=i.theatercode and (balancedate is null or balancedate='')
    end
    现在 我要更新两个表, 提交事物时,就报这个错误,我把触发器删除了,就不会报异常,是不是更新两个表,inserted 表不知道是哪个? 求高手解答, 上面回答的,都没有入题,
    如果没有ID ,异常会是那个异常么?!!!