MySQLビューはトランザクション内で更新されない(Hibernate / Spring)
質問
MySQLデータベース上のデータアクセスのためのDIおよびHibernateのためのSpringを使用しています。テーブルにレコードを挿入してから、そのテーブルを照会するビューを実行し、集約計算を実行するビューを実行します。私が見る問題は、同じトランザクション中に挿入されたレコードがビューの計算値に含まれていません。MySQL Workbenchで同じビューを実行し、挿入された値がビューに含まれます。誰かがこれを引き起こしているのか知っていますか?
解決
最終的には、entityManager.refresh(オブジェクトエンティティ)を呼び出して、更新したいビューレコードのエンティティを更新しなければなりませんでした。この問題は、更新された元のエンティティに依存していることがわからないので、Hibernateが表示を更新する必要があることを認識できないという事実に存在すると思います。Hibernateがビューからレコードをキャッシュしていると推定し、フラッシュ()の後でも更新する必要があることを知りません。
Hibernateは、現実の中でビューがテーブルに依存し、テーブルが変更されるたびに「汚れ」にする必要がある場合、元のテーブルとビューを完全に無関係に見ています。それを認識するために休止状態になる方法がわかりません。
他のヒント
最もあなたはまだデータベースへの変更をフラッシュしていません。Hibernateは、行を挿入したテーブルと後で読んでいるビューの間に接続があることを知りません。照会する前にEntityManager(またはセッションまたはテンプレート)をフラッシュします。
これはおそらくREPEATABLE READ
であるMySQLのデフォルトの分離レベルによって引き起こされます。
これは、MySQL Workbenchでのトランザクションが end そのトランザクションまでの変更を表示しないことを意味します。トランザクションとして選択カウントを実行します。
コミット(またはロールバック)を発行すると、MySQL Workbenchの変更が表示されます。
あなたのインストールのデフォルトの分離レベルをREAD COMMITTED
に変更したり、MySQL Workbenchでのセッションの分離レベルをREAD COMMITTED
マニュアルに記載されている方法の詳細は、マニュアルにあります。