2011-08-08 5 views
6

休止状態:休止状態 データベーストリガーと私はシナリオ会った

  • insertまたはupdate前に実行されるターゲット表上のトリガーがあることで

    1. saveまたはupdateターゲット表のいくつかのデータをHibernateがこのレコードアウトターゲット表
    2. selectの操作

    しかし、トリガーによって修正されたフィールドは実際には取り出されないことがわかります。 これは、Hibernateのコミット(flush()がすでに呼び出されているトランザクション)またはHibernateキャッシュと関連していますか?ありがとう。

  • 答えて

    4

    これは、最初の(セッション)キャッシュまたは2番目のキャッシュ(たとえばehcache)キャッシュの両方によって発生する可能性があります。エンティティを再読み込みするには、session.refresh()を呼び出す必要があります。 hibernate docsから

    (セクションの下部)

    これはリフレッシュ()メソッドを使用して、任意 時に再ロードするオブジェクトとそのすべてのコレクションすることが可能です。これは、データベース トリガを使用してオブジェクトのプロパティの一部を初期化する場合に便利です。

    sess.save(cat); 
    sess.flush(); //force the SQL INSERT 
    sess.refresh(cat); //re-read the state (after the trigger executes) 
    
    9

    あなたはgenerated valuesとしてプロパティをマッピングすることができます。これらの値は常にデータベースから取得され、格納することはできません。 Hibernateは、データベースを挿入または更新した後に、後続のクエリでこれらの値を自動的にロードします。

    関連する問題