2012-08-31 15 views
10

永続オブジェクトの自動更新を休止することはできますか?hibernate/JPAで自動更新を無効にする方法

@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); 
     } 
    } 

は、ここでは、コードで何が起こるかですが、私は、永続的な状態であることが、私は、エンティティのフィールドの一部を更新するために、Hibernateが考えられるであろうエンティティを取得し、その後、検証にエンティティを渡します。検証に失敗した場合は、検証を成功させてエンティティを永続化させてから、udpateしないでください。

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

私は検証を行い、問題を回避する方法を変更できるので、回避策には興味がありません。私は永続オブジェクトを自動的に更新する休止状態の機能をどのように無効にできるのかを知ることに興味があります。

JPAのhibernateの実装を使用していることに注意してください。だから、Hibernate固有のAPIを扱っているHibernate固有の答えは私にとってはうまくいかないでしょう。

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

おかげ

--edit --- 私はこの解決策を見つけることができませんでしたので、私は、私が使用して宣言的トランザクションにいるにもかかわらず、いかなるのRuntimeExceptionをスローせずにトランザクションをロールバックすることにしました:

TransactionInterceptor.currentTransactionStatus()。setRollbackOnly();

チャームのように機能します。

答えて

0

検証に失敗した場合に例外をスローし、呼び出し側がそれを処理するようにします。

+0

おかげで、私はイムは、回避策を探していないと述べたように、私はすでに、イムは、自動更新をディアブルできるように固有の設定を探していることがあります。 – lutfijd

1

セッション用にFlushModeを設定します。

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

+0

これは主にHibernate固有のAPIで、クエリを実行する前にHibernateがどのように動作するか(古くなったデータを避けるためにフラッシュするかどうか)に関係します。 JPA EntityManagerでは、フラッシュモードを設定できますが、クエリー管理にのみ関連します。 EntityManagerのフラッシュモードを別のタイプに設定しようとしていても、まだ違いはありませんでした。 – lutfijd

+0

@userあなたのコメントは私には分かりません。上記で貼り付けたリンクでは、「フラッシュ・ストラテジを表します。フラッシュ・プロセスは、状態の変化を検出してSQL文を実行することにより、データベースの状態をセッション状態と同期させます。 [link](http://stackoverflow.com/questions/3220336/whats-the-use-of-session-flush-in-hibernate) –

+0

を参照してください。これは、JPA APIではなく、Hibernate固有のAPIです。 秒:JPAのフラッシュモード設定は、JPAに2つのフラッシュモードタイプcommitおよびautoがあり、手動モードを持たないため、動作に影響しません。 私の質問に戻るJPAでの自動更新を無効にする方法は、提供したリンクがJPAコンテキストで多くの助けにならないためです。 – lutfijd

0

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

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
関連する問題