有时在持久化一个 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)
.
.
.