最新のタイムスタンプで記録を更新し続けようとしています。少し前に例外が発生しました。現在、例外は発生していませんが、データベースでレコードが更新されていません。
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Duplicate entry '1584034242' for key 'PRIMARY'
org.hibernate.exception.ConstraintViolationException: Duplicate entry '1584034242' for key 'PRIMARY'
session.flush();
最終ブロックでオンライン。
更新中のレコードには、(DB 内の既存のレコードの) 同じ主キーがありますが、2 つの列の値が変更されているため、重複していません。私はそれがここで私を救うことを期待していsaveOrUpdate
ました、そしてそれはしばらく前に働いていました.
public void flush(Object dataStore) throws DidNotSaveRequestSomeRandomError {
Transaction txD;
Session session;
session = currentSession();
if (session.getTransaction() != null && session.getTransaction().isActive()) {
txD = session.getTransaction();
} else {
txD = session.beginTransaction();
}
try {
session.saveOrUpdate(dataStore);
} catch (MappingException e) {
e.printStackTrace();
}
try {
txD.commit();
while (!txD.wasCommitted())
;
} catch (ConstraintViolationException e) {
log.error("Unable to store data from " + dataStore.getClass().toString());
txD.rollback();
throw new DidNotSaveRequestSomeRandomError(dataStore, feedbackManager);
} catch (TransactionException e) {
log.debug("txD state isActive" + txD.isActive() + " txD is participating"
+ txD.isParticipating());
log.debug(e);
txD.rollback();
} finally {
session.flush();
txD = null;
session.close();
}
}
編集:さらに多くのグーグル検索を行い、これを機能させるにはxml定義で動的更新を使用する必要があることがわかりました。
<class name="My.Java.Class"
table="MyTable" dynamic-update="true">
それでも機能しません。重複したエントリが表示されます。update 句は使用していませんが、saveORUpdate が機能すると想定しています。そして、それを機能させる何らかの方法があるはずです。
また
代わりにconstraintViolationExceptionをキャッチして、強制的な「更新」句を実行する必要がありますか?