Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理StaleStateException_Java_Hibernate - Fatal编程技术网

Java 处理StaleStateException

Java 处理StaleStateException,java,hibernate,Java,Hibernate,我正在我的项目中使用Hibernate。我有两个方法被并发调用,它们试图更新相同的行。在下面的代码中,这两个方法是updateSessionStatus()和updatePayloadTableAggregateTxtFileName()。为了处理并发更新,我在映射文件中使用了version标记。问题是更改没有反映在数据库中,无论最后一次提交的是哪种方法,其更改都会反映出来以解决此问题。在本例中,我使用的版本标记很长,如果在更新过程中出现版本不匹配,我将处理StaleStateException

我正在我的项目中使用Hibernate。我有两个方法被并发调用,它们试图更新相同的行。在下面的代码中,这两个方法是updateSessionStatus()updatePayloadTableAggregateTxtFileName()。为了处理并发更新,我在映射文件中使用了version标记。问题是更改没有反映在数据库中,无论最后一次提交的是哪种方法,其更改都会反映出来以解决此问题。在本例中,我使用的版本标记很长,如果在更新过程中出现版本不匹配,我将处理StaleStateException以合并更改。 但它不起作用,我也得到了例外 HH000346:托管刷新期间出错[批更新从更新[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();
    }
}

两个更新方法的catch块以不同的顺序调用rollback/handleStale(),这可能是无意的。我正在处理StaleStateException以合并更改。你不能。至少不是这样。在发生hibernate异常后,唯一明智的做法是回滚事务并关闭会话@谢谢你的建议,但我的要求是更新这两个更改,你能提供链接或资源来说明如何处理这种情况吗。你需要回滚事务,关闭会话,然后重试。两个更新方法的捕获块调用rollback/handleStale()以不同的顺序-这可能是无意的。我正在处理StaleStateException以合并更改。你不能。至少不是这样。在发生hibernate异常后,唯一明智的做法是回滚事务并关闭会话@谢谢您的建议,但我的要求是更新这两个更改,您能否提供链接或资源,说明如何处理这种情况。您需要回滚事务,关闭会话,然后重试。