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();最終ブロックでオンライン。

更新中のレコードには、(DB 内の既存のレコードの) 同じ主キーがありますが、2 つの列の値が変更されているため、重複していません。私はそれがここで私を救うことを期待してい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">

それでも機能しません。重複したエントリが表示されます。update 句は使用していませんが、saveORUpdate が機能すると想定しています。そして、それを機能させる何らかの方法があるはずです。

また

代わりにconstraintViolationExceptionをキャッチして、強制的な「更新」句を実行する必要がありますか?

4

4 に答える 4

0

hibernateは主キーID値を取得しなかったと思います。データストアBeanでそれを試すことができる1つのことは、次のような主キーフィールドのgetterメソッドでIDを割り当てます。

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

私は以前に同じ問題に直面していました、そしてそれは私を助けます。

于 2013-03-22T10:07:22.697 に答える
0

私はあなたがあまりにも多くのtrycatchブロックを使用していると思いますこれをよりよくしてくださいそしてそれは;でループしている間です それをする必要はありません。

 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 に答える
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 に答える