MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

HibernateException: Unexpected row count: 0 expected: 1

Posted on 2009-07-22 11:13 leekiang 阅读(2433) 评论(0)  编辑  收藏 所属分类: hibernate
[org.hibernate.event.def.AbstractFlushingEventListener] - 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)

    先用对象操作得到Person p = get(Person.class,35);
    直连得到connection,执行delete person where id=35
    
    事务提交前hibernate会对对象进行检查,看属性是否有变化,如果有变化就会执行update操作。
    事务方法内既有对象操作,又有sql时,往往sql先执行,
    id=35的记录已经被删了,再执行update 35时就会报那个臭名昭著的HibernateException: Unexpected row count: 0 expected: 1,不能同步数据库状态
    为什么有的记录删除时会update,有的却没有?开始一直没找到原因,因为update语句太长了,
    后来灵机一动,在映射里加了dynamic-update="true",update语句变成了可爱的update Person set zd=? where ID=?
    一查AbstractPerson,发现getZd()被修改了:
        public String getZd() {
        if (zd != null)
            return zd;
        else
            return "";
       }
    这样凡是zd为null的记录,删除时都会报错。
    
    总结:(1)HQL和sql共用时要小心,一不小心就出现数据不同步,有空看看事务的处理
          (2)映射的类里的get方法不要随便修改

只有注册用户登录后才能发表评论。


网站导航: