![](/img/trans.png)
[英]Update record if somcolumn!=“somevalue”, using Hibernate saveorupdate()
[英]Hibernate : Random Exceptions and record not updated during session flush, using saveOrUpdate
我正在尝试用最新的时间戳更新记录。 前一阵子我遇到了异常。 现在,我没有收到异常,但是记录不会在数据库上更新。
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();
在最后块。
要更新的记录具有(数据库中现有记录的)相同的主键,但是两列的值已更改,因此它不是重复的。 我原本以为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定义中使用dynamic-update来使它工作。
<class name="My.Java.Class"
table="MyTable" dynamic-update="true">
仍然不起作用,我得到了重复的条目。 我没有使用update子句,但是假设saveORUpdate应该工作。 而且应该有某种办法使它工作。
要么
我应该捕获constraintViolationException并执行强制的“ update”子句吗?
flush()方法只是与数据库同步,然后您需要提交或清除会话以查看更改。
如果确实要提交,它会自动刷新,您也可以从另一个会话中看到所做的更改。
我认为您正在使用太多try catch块来更好地做到这一点, 而使用a进行while循环又是什么呢? 不需要这样做。
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();
}
我认为休眠没有获取您的主键ID值,您可以尝试在DataStore bean中尝试在主键字段的getter方法中分配ID,例如
String getPrimayValue(String primayValue)
{
this.primayValue = primayValue;
return primayValue;
}
我之前也遇到过同样的问题,它对我有帮助。
做了很多谷歌搜索,发现我需要在我的xml定义中使用dynamic-update来使它起作用。
<class name="My.Java.Class"
table="MyTable" dynamic-update="true">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.