Posted on 2009-07-22 11:13
leekiang 阅读(2439)
评论(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方法不要随便修改