Java 处理StaleStateException
我正在我的项目中使用Hibernate。我有两个方法被并发调用,它们试图更新相同的行。在下面的代码中,这两个方法是updateSessionStatus()和updatePayloadTableAggregateTxtFileName()。为了处理并发更新,我在映射文件中使用了version标记。问题是更改没有反映在数据库中,无论最后一次提交的是哪种方法,其更改都会反映出来以解决此问题。在本例中,我使用的版本标记很长,如果在更新过程中出现版本不匹配,我将处理StaleStateException以合并更改。 但它不起作用,我也得到了例外 HH000346:托管刷新期间出错[批更新从更新[0]返回意外的行数;实际行数:0;应为:1]。 请帮忙Java 处理StaleStateException,java,hibernate,Java,Hibernate,我正在我的项目中使用Hibernate。我有两个方法被并发调用,它们试图更新相同的行。在下面的代码中,这两个方法是updateSessionStatus()和updatePayloadTableAggregateTxtFileName()。为了处理并发更新,我在映射文件中使用了version标记。问题是更改没有反映在数据库中,无论最后一次提交的是哪种方法,其更改都会反映出来以解决此问题。在本例中,我使用的版本标记很长,如果在更新过程中出现版本不匹配,我将处理StaleStateException
public void updateSessionStatus(int jobId, String crcFileName, String crc) {
Session session = HibernateSessionFactory.getSessionFactory()
.openSession();
Transaction tx = null;
PayloadTableDao payloadTableDao = null;
try {
tx = session.beginTransaction();
Criteria crit = session.createCriteria(PayloadTableDao.class);
crit.add(Restrictions.eq("jobId", jobId));
ScrollableResults items = crit.scroll();
while (items.next()) {
payloadTableDao = (PayloadTableDao) items.get(0);
if (payloadTableDao.getError() == null) {
payloadTableDao.setCrcFileName(crcFileName);
payloadTableDao.setCrc(crc);
}
session.saveOrUpdate(payloadTableDao);
session.update(payloadTableDao);
}
tx.commit();
} catch (HibernateException asd) {
if (asd instanceof StaleStateException) {
// session.merge(payloadTableDao);
handleStale(payloadTableDao);
}
if (tx != null) {
tx.rollback();
}
LOGGER.debug(asd.getMessage());
} finally {
session.close();
}
}
public void updatePayloadTableAggregateTxtFileName(int jobId,
String txtFileName) {
Session session = HibernateSessionFactory.getSessionFactory()
.openSession();
Transaction tx = null;
PayloadTableDao payloadTableDao = null;
try {
tx = session.beginTransaction();
Criteria crit = session.createCriteria(PayloadTableDao.class);
crit.add(Restrictions.eq("jobId", jobId));
ScrollableResults items = crit.scroll();
while (items.next()) {
payloadTableDao = (PayloadTableDao) items.get(0);
if (payloadTableDao.getError() == null) {
payloadTableDao.setTxtFileName(txtFileName);
}
session.update(payloadTableDao);
}
tx.commit();
} catch (HibernateException asd) {
if (tx != null) {
tx.rollback();
}
if (asd instanceof StaleStateException) {
// session.merge(payloadTableDao);
handleStale(payloadTableDao);
}
LOGGER.debug(asd.getMessage());
} finally {
session.close();
}
}
public synchronized void handleStale(PayloadTableDao payloadTableDao) {
Session session = HibernateSessionFactory.getSessionFactory()
.openSession();
System.out
.println("***************************************************************");
Transaction tx = null;
try {
tx = session.beginTransaction();
session.merge(payloadTableDao);
tx.commit();
} catch (HibernateException e) {
LOGGER.error(e.getMessage(), e);
if (tx != null)
tx.rollback();
throw e;
} finally {
session.close();
}
}
两个更新方法的catch块以不同的顺序调用rollback/handleStale(),这可能是无意的。我正在处理StaleStateException以合并更改。你不能。至少不是这样。在发生hibernate异常后,唯一明智的做法是回滚事务并关闭会话@谢谢你的建议,但我的要求是更新这两个更改,你能提供链接或资源来说明如何处理这种情况吗。你需要回滚事务,关闭会话,然后重试。两个更新方法的捕获块调用rollback/handleStale()以不同的顺序-这可能是无意的。我正在处理StaleStateException以合并更改。你不能。至少不是这样。在发生hibernate异常后,唯一明智的做法是回滚事务并关闭会话@谢谢您的建议,但我的要求是更新这两个更改,您能否提供链接或资源,说明如何处理这种情况。您需要回滚事务,关闭会话,然后重试。