我在我的项目中使用Hibernate。我有两个方法被并发调用,他们尝试更新相同的行。在以下代码中,两个方法是 updateSessionStatus()和 updatePayloadTableAggregateTxtFileName()。为了处理并发更新,我在映射文件中使用了version标签。问题是更改没有反映在数据库中,无论哪种方法最后提交它的更改都会反映出来解决这个问题我正在使用版本标签,在这种情况下很长,如果在更新期间版本不匹配我我正在处理 StaleStateException 来合并更改。 但它不起作用,我得到了例外 HHH000346:托管刷新期间出错[批量更新从更新[0]返回意外行数;实际行数:0;预期:1]。 请帮忙。
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();
}
}