在使用hibernate进行删除操作的时候,报了一个奇怪的错误:
org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1;主键设置是自增的,删除操作代码如下:
session=sf.getCurrentSession();
Meeting m=new Meeting();
m.setId(id);

try{
  session.delete(m);
}catch(Exception e){
  e.printStackTrace();
  return false;
}
return true;百度了一下,这个问题是更新时主键设置不对引起的,可是我进行的是删除操作,怎么还会出现这个异常,求解答
Hibernate异常

解决方案 »

  1.   

    你的ID不能写成JAVA中的Inter这个类型,你得写成int ; 
    不然它就出问题 了;
      

  2.   

    先用load获取一个对象的实例试试?
      

  3.   

    找到问题了,我是删除之后再跳到一个查询的action的,但是很奇怪的是查询之后又执行了一次删除操作
    Hibernate: delete from Meeting where id=?Hibernate: select meeting0_.id as id1_2_, meeting0_.address as address2_2_, meeting0_.content as content3_2_, meeting0_.listener as listener4_2_, meeting0_.speaker as speaker5_2_, meeting0_.subject as subject6_2_, meeting0_.time as time7_2_ from Meeting meeting0_Hibernate: delete from Meeting where id=?struts.xml配置:
      <action name="deleteSupply" class="com.oa.action.OfficeSupplyAction">
               <result type="chain">
                   <param name="actionName">queryAll</param>
                   <param name="namespace">/supply</param>
               </result>
       </action>页面使用了js来判断跳转:
    function del(){
      var url=document.getElementById("id").getAttribute("href");
      if(confirm("确定要删除吗?")){
        window.location.href=url;
        alert("删除成功!");
        return true;
      }
      return false;
    }而且我把删除操作换成hql语句的形式就没问题,很奇怪啊,求解答
      

  4.   

    Meeting m=new Meeting();//m对象现在是transient状态
     m.setId(id);
    session.delete(m);
    Hibernate执行删除,一般需要从库中获取对象(load,get)而不是new一个对象,待对象变成持久状态后,再执行删除操作,这样对象就变成游离态。