12

hibernateが永続オブジェクトを自動更新するのを停止することは可能ですか?

    @Transactional
    public ResultTO updateRecord(RequestTO requestTO) {

        Entity entity = dao.getEntityById(requestTO.getId());

         // now update the entity based on the data in the requestTO

         ValidationResult validationResult = runValidation(entity);

         if(validationResult.hasErrors()) {
            // return ResultTO with validation errors
         } else {
             dao.persist(entity);
        }
    }

コードで何が起こるかを次に示します。休止状態によって永続状態であると見なされるエンティティを取得し、エンティティ内のいくつかのフィールドを更新してから、エンティティを検証に渡します。検証が失敗した場合は、更新しないでください。検証が成功した場合は、エンティティを永続化します。

このフローの主な問題は次のとおりです。検証で使用するエンティティを更新したため、(DAOで)persist()メソッドを呼び出すかどうかは関係ありません。休止状態のため、レコードは常に更新されます。エンティティが変更されたことを検出し、更新のフラグを立てます。

検証の方法を変更して問題を回避できることを覚えておいてください。そのため、回避策には興味がありません。永続オブジェクトを自動的に更新するHibernate機能を無効にする方法を知りたいです。

私は休止状態のJPAの実装を使用していることに注意してください。そのため、Hibernate固有のAPIを扱うHibernate固有の回答は私には機能しません。

私は休止状態の構成を探して、この動作を停止するように構成を設定できるかどうかを確認しようとしましたが、うまくいきませんでした。

ありがとう

--EDIT ---これに対する解決策が見つからなかったため、次を使用して宣言型トランザクションを実行している場合でも、RuntimeExceptionをスローせずにトランザクションをロールバックすることを選択しました。

TransactionInterceptor.currentTransactionStatus()。setRollbackOnly();

これは魅力のように機能します。

4

4 に答える 4

4

セッションの FlushMode を構成します。

http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

于 2012-09-01T22:24:35.570 に答える
1

次のコードを呼び出すことができます。

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
于 2015-04-16T07:27:19.193 に答える
0

検証が失敗した場合は例外をスローし、呼び出し元にそれを処理させます。

于 2012-08-31T22:54:12.850 に答える