org.hibernate.StaleStateException:批量更新从update [0]返回意外的行数; 实际行数:0; 预期:1

use*_*196 5 java mysql hibernate stalestateexception

有时,当持久化obj时,其中一个字段太大而无法放入db字段,从而导致数据截断异常.在下面的代码中,我尝试捕获DataException并简单地清空该字段和重新保存.但是我在重新开始时遇到了异常.为什么会发生批量更新异常以及如何解决它?


 public static void save(Object obj) throws Exception{
        try{
            beginTransaction();
            getSession().save(obj);
            commitTransaction();

        }catch(Exception e){
            e.printStackTrace();
            rollbackTransaction();
            throw e;
        }finally{
            closeSession(); //not needed, session obtained from sf.getCurrentSession() will auto close
        }
    }   
 public static void saveXXX(XXX rec){

        try {
            save(rec);
        } catch (org.hibernate.exception.DataException e) {
            e.printStackTrace();

            saveXXX(rec, e); //causes an exception      
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    private static void saveXXX(WhoisRecord rec, DataException e) {
        rec.setField(""); //empty out the problem field
        saveXXX(rec);

例外:

org.hibernate.StaleStateException:批量更新从update [0]返回意外的行数; 实际行数:0; 预期:1
    在org.hibernate.jdbc.Expectations $ BasicExpectation.checkBatched(Expectations.java:85)
    在org.hibernate.jdbc.Expectations $ BasicExpectation.verifyOutcome(Expectations.java:70)
    在org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)
    在org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    在org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    在org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
    在org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
    在org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
    在org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2382)
    在org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)
    在org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)
    在org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)
    在org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    在org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    在org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
    在org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    在org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    在org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
    在org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
    在org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
.
.
.

Chr*_*lli 2

我没有足够的线索来准确地告诉你。我只能说我遇到了同样的问题,并通过调用 merge() 而不是 save() 解决了。您应该始终使用 merge() 以防分离对象。