1

我正在尝试使用最新的时间戳更新记录。不久前,我遇到了一个例外。现在,我没有收到异常,但数据库中的记录没有更新。

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();在finally块上线。

正在更新的记录具有相同的主键(数据库中现有记录的),但两列的值已更改,因此它不是重复的。我原以为这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 定义中使用动态更新才能让它工作。

<class name="My.Java.Class"
    table="MyTable" dynamic-update="true">

仍然不起作用,我得到那个重复的条目。我没有使用更新子句,而是假设 saveORUpdate 应该可以工作。并且应该有某种方式让它工作。

或者

我应该抓住 constraintViolationException 并改为执行强制“更新”子句吗?

4

4 回答 4

0

我认为hibernate没有得到你的主键id值,你可以在你的DataStore bean中尝试在主键字段的getter方法中分配id,比如

String getPrimayValue(String primayValue)
{
    this.primayValue = primayValue;
    return primayValue;
}

我以前遇到过同样的问题,它对我有帮助。

于 2013-03-22T10:07:22.697 回答
0

做了更多的谷歌搜索,发现我需要在我的 xml 定义中使用动态更新才能让它工作。

<class name="My.Java.Class"
    table="MyTable" dynamic-update="true">
于 2013-03-22T11:29:49.380 回答
0

flush() 方法只是与数据库同步,然后您需要提交或清除会话以查看更改。

如果你只是提交。它会自动刷新,你也可以从另一个会话中看到你的更改。

于 2013-03-22T09:38:12.800 回答
0

我认为你使用了太多的 try catch 块更好地做到这一点,以及带有;的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();
    }
于 2013-03-22T09:44:35.050 回答