有时在持久化一个 obj 时,它的某个字段太大而无法放入 db 字段,从而导致数据截断异常。在下面的代码中,我尝试捕获 DataException 并简单地清空该字段,然后重新保存。但是,重新保存时出现异常。为什么会出现批量更新异常,我该如何解决?
公共静态无效保存(对象 obj)抛出异常 { 尝试{ 开始交易(); getSession().save(obj); 提交交易(); }catch(异常 e){ e.printStackTrace(); 回滚交易(); 扔 e; }最后{ 关闭会话();//不需要,从 sf.getCurrentSession() 获取的会话会自动关闭 } } 公共静态无效保存XXX(XXXREC){ 尝试 { 保存(记录); } 捕捉(org.hibernate.exception.DataException e){ e.printStackTrace(); 保存XXX(rec, e); //导致异常 } 捕捉(异常 e){ e.printStackTrace(); } } 私人静态无效 saveXXX(WhoisRecord 记录,DataException e){ rec.setField(""); //清空问题字段 保存XXX(rec);
例外:
org.hibernate.StaleStateException:批量更新从更新 [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) . . .