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) で . . .