次のようなコードがあります。
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
try {
for ( Customer customer: customers ) {
i++;
session.update(customer);
if ( i % 200 == 0 ) { //200, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
} catch (Exc e) {
//TODO want to know customer id here!
}
tx.commit();
session.close();
たとえば、ある時点で session.flush() が DataException を発生させたとします。これは、200 人の顧客のバッチの 1 つであるフィールドの 1 つがデータベースの列サイズにマップされなかったためです。何も問題はありません。データが破損している可能性があります。この場合は問題ありません。しかし、失敗した顧客 ID を知る必要があります。データベースは意味のないエラー メッセージを返し、ステートメントのパラメーターが何であったかなどを示しません。キャッチされた例外には、失敗した顧客も含まれず、「update Customer set name=?」のような SQL ステートメント テキストのみが含まれます。
休止状態セッションを使用して、どうにかしてそれを判断できますか? 保存しようとした最後のエンティティに関する情報をどこかに保存しますか?