我正在尝试使用最新的时间戳更新记录。前一段时间我得到了一个例外。现在,我没有得到异常,但记录没有在数据库上更新。
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Duplicate entry '1584034242' for key 'PRIMARY'
org.hibernate.exception.ConstraintViolationException: Duplicate entry '1584034242' for key 'PRIMARY'
在finally块中的session.flush();
行。
正在更新的记录具有相同的主键(数据库中现有记录的主键),但更改了两列的值,因此其不重复。我期待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();
}
}
编辑: 做了很多googleing并发现我需要在我的xml定义中使用dynamic-update来使其工作。
<class name="My.Java.Class"
table="MyTable" dynamic-update="true">
仍然无效,我得到了重复的条目。我没有使用更新子句,但假设saveORUpdate应该工作。应该有一些方法让它运作。
或
我应该捕获constraintViolationException并改为执行强制“update”子句吗?
答案 0 :(得分:0)
齐平() 方法只需与db同步,然后您需要提交或清除会话以查看更改。
如果您只是提交。它会自动刷新,您也可以从其他会话中看到您的更改。
答案 1 :(得分:0)
我认为你正在使用太多尝试catch阻止更好地执行此操作,是什么循环使用; 执行此操作不是必需的。
try {
txD.commit();
while (!txD.wasCommitted()) ;//this is not needed
}
您可以简单地执行以下操作:
try{
session = currentSession();
if (session.getTransaction() != null && session.getTransaction().isActive()) {
txD = session.getTransaction();
} else {
txD = session.beginTransaction();
}
session.saveOrUpdate(dataStore);
txD.commit();
}catch (MappingException e) {
e.printStackTrace();
}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();
}
答案 2 :(得分:0)
我认为hibernate没有获得你的主键id值, 有一件事你可以在DataStore bean中尝试在主键字段的getter方法中分配id,如
String getPrimayValue(String primayValue)
{
this.primayValue = primayValue;
return primayValue;
}
我以前遇到过同样的问题,这对我很有帮助。
答案 3 :(得分:0)
进行了更多googleing并发现我需要在我的xml定义中使用动态更新才能使其正常工作。
<class name="My.Java.Class"
table="MyTable" dynamic-update="true">