我正在尝试使用最新的时间戳更新记录。不久前,我遇到了一个例外。现在,我没有收到异常,但数据库中的记录没有更新。
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();
在finally块上线。
正在更新的记录具有相同的主键(数据库中现有记录的),但两列的值已更改,因此它不是重复的。我原以为这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">
仍然不起作用,我得到那个重复的条目。我没有使用更新子句,而是假设 saveORUpdate 应该可以工作。并且应该有某种方式让它工作。
或者
我应该抓住 constraintViolationException 并改为执行强制“更新”子句吗?