多个线程同时并发
同时new 一个业务对象
{UserModel model = new UserModel();然后删除
 model.deleteUser(al); } 删除的代码如下 Session session = dao.getSession();
Transaction ta = session.beginTransaction();
启动事务
ta.begin();
if (dao.findById(userDTO.getId()) != null) {
session.clear();
dao.delete(user);
} else {
ystem.out.println("not delete,That ID haes ceased to exist:"+ userDTO.getId());
}
ta.commit();
session.close();结果抛出异常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:93)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
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:985)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at com.linkey.model.UserModel.deleteUser(UserModel.java:116)
at com.linkey.test.UserModelTest.del(UserModelTest.java:85)
at com.linkey.test.TestThreads$Inc.run(TestThreads.java:18)
at java.lang.Thread.run(Unknown Source)

解决方案 »

  1.   

    在Hibernate中是不需用ta.begin()这样的代码来启动事务的.
    在动行下面代码的时候:Transaction ta = session.beginTransaction(); 这时事务就已经启动.
    从你的错误信息上看,有可能是你的mapping配置或数据库的级联设置出了问题.
    下面是我以前写的一段删除代码希望对你有所帮助:
    public void delStudent(BaseDM baseDM) throws FatalException {
    Student bean=(Student)baseDM;
    StudentDAO dao=new StudentDAO();
    bean=dao.findById(bean.getId());
    Session s=HibernateSessionFactory.getSession();
         Transaction t=s.beginTransaction();
            s.delete(bean);
            t.commit();
            s.flush();
            s.close();
    }
      

  2.   

    "Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1"这个异常的出现,跟你是主键策略有关,你看看你的数据库表的每个主键,是不是有用STING的,如果有,在HIBERNATE映射是要用ASSIGNED的或则就会报这个错误
      

  3.   

    这个错误是很不好搞的,我也遇到过,不过就象jetty_xiang说的一样,我的问题是那样找到的,不知道你是不是还是这个问题