DI には Spring を使用し、mySQL データベースのデータ アクセスには Hibernate を使用しています。テーブルにレコードを挿入し、そのテーブルにクエリを実行して集計計算を実行するビューを実行するトランザクション内にコードがあります。問題は、同じトランザクション中に挿入したばかりのレコードが、ビューの計算値に含まれていないことです。mySQL ワークベンチで同じビューを実行すると、挿入された値がビューに含まれます。誰がこれを引き起こしているのか知っていますか?
3 に答える
最終的に、entityManager.refresh(Object entity) を呼び出して、更新したいビュー レコードのエンティティを更新する必要がありました。問題は、Hibernate が更新された元のエンティティに (データベース レベルで) 依存していることを認識していないため、ビューを更新する必要があることを認識できないという事実にあると思います。Hibernate はビューからレコードをキャッシュしており、flush() の後でも更新する必要があることを認識していないと思います。
実際にはビューはテーブルに依存しており、テーブルが変更されるたびに「ダーティ」にする必要がある場合、Hibernate は元のテーブルとビューを完全に無関係と見なします。Hibernateにそれを認識させる方法がわかりません。
ほとんどの場合、データベースへの変更をまだフラッシュしていません。Hibernate は、行を挿入したテーブルと後で読んでいるビューの間に接続があることを知りません。view を照会する前に、entitymanager (またはセッションまたはテンプレート) をフラッシュします。
これは、MySQLのデフォルトの分離レベルである。が原因である可能性がありますREPEATABLE READ
。
これは、MySQL Workbenchのトランザクションは、そのトランザクションを終了するまで変更を認識しないことを意味します。SELECTの実行は、トランザクションとしてカウントされます。
コミット(またはロールバック)を発行すると、MySQLWorkbenchに変更が表示されます。
インストールのデフォルトの分離レベルをに変更するか、READ COMMITTED
MySQLWorkbenchのセッションの分離レベルを次のように変更することをお勧めします。READ COMMITTED
それを行う方法の詳細は、マニュアルに記載されています。