obj を永続化するときに、そのフィールドの 1 つが大きすぎて db フィールドに収まらないことがあり、その結果、データ切り捨て例外が発生します。次のコードでは、DataException をキャッチしてフィールドを空にし、再保存しようとしています。ただし、再保存すると例外が発生します。バッチ更新の例外が発生する理由と回避方法を教えてください。
public static void save(Object obj) throws Exception{
試す{
beginTransaction();
getSession().save(obj);
commitTransaction();
}キャッチ(例外e){
e.printStackTrace();
ロールバックトランザクション();
eを投げます。
}最後に{
closeSession(); // 必要ありません。sf.getCurrentSession() から取得したセッションは自動的に閉じます
}
}
public static void saveXXX(XXX rec){
試す {
保存(記録);
} catch (org.hibernate.exception.DataException e) {
e.printStackTrace();
saveXXX(rec, e); //例外を発生させます
キャッチ(例外e){
e.printStackTrace();
}
}
private static void saveXXX(WhoisRecord rec, DataException e) {
rec.setField(""); //問題フィールドを空にする
saveXXX(記録);
例外:
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) で
.
.
.