2012-03-12 27 views
3

私はDI用にSpringを使用し、mySQLデータベース上ではデータアクセス用にHibernateを使用しています。レコードをテーブルに挿入し、そのテーブルをクエリして集計計算を実行するビューを実行するトランザクション内にコードがあります。私が見る問題は、同じトランザクション中に挿入したばかりのレコードは、ビューの計算値に含まれていないということです。私はmySQLワークベンチで同じビューを実行し、挿入された値がビューに含まれています。誰がこれを引き起こしているか知っていますか?トランザクション(Hibernate/Spring)内でmysqlビューがリフレッシュされない

答えて

5

最後に、私が更新したいビューレコードのエンティティを更新するために、entityManager.refresh(Object entity)を呼び出す必要がありました。私は問題は、Hibernateが更新された元のエンティティに(データベースレベルで)依存していることを知らないため、ビューを更新する必要があることを認識できないという事実にあると思います。私は、Hibernateがビューからレコードをキャッシュしていて、flush()の後でさえ、更新が必要であることを知らないと推測します。

Hibernateは、実際にはビューがテーブルに依存しているため、テーブルが変わるたびに「ダーティ」にする必要がありますが、元のテーブルとビューは完全に無関係であるとみなします。私はHibernateにそれを認識させる方法を知らない。

+0

テーブルからいくつかのレコードを削除した後、セッションとクエリのビューを使用してテーブルを照会すると、これがどのように実行されるのだろうか? –

2

ほとんどの場合、データベースへの変更はまだフラッシュされていません。 Hibernateは、あなたが挿入したテーブルと後で読んでいるビューとの間に接続があることを知らない。ビューを照会する前にentitymanager(またはセッションまたはテンプレート)をフラッシュします。

+0

フラッシュが機能しませんでした。 entityManagerのrefreshメソッドを呼び出して、データベースからの変更を更新する必要がありました。 –

+0

これはキャッシュの問題かどうか疑問に思います。 –

1

これはおそらく、MySQLのデフォルトの分離レベルがREPEATABLE READであることが原因です。

これは、終了そのトランザクションまでMySQL Workbenchでのトランザクションの変更が表示されないことを意味します。 SELECTを実行すると、トランザクションとしてカウントされます。

コミット(またはロールバック)を発行すると、MySQL Workbenchの変更が表示されます。

あなたはおそらく、あなたがそれを行う方法についての詳細は、マニュアルに記載されていますREAD COMMITTEDにインストールのデフォルトの分離レベルのいずれかを変更したり、READ COMMITTED

へのMySQL Workbenchのセッションの分離レベルを変更したいです。

+1

はREAD COMMITTED、READ-UNCOMMITTEDを試してみたが、どちらも問題を解決していない。 –

関連する問題