hibernate

さて、今hibernateでハマってます。

どうも、キャッシュが悪さしているのか、
AテーブルとBテーブルのリンクテーブルCがあり、
Aテーブルのマッピングには当然のことながらsetタグでBのコレクションを持つように書いてるわけです。
Bのコレクションのうち一つをremoveし、Aをupdate。
これで、テーブル上からはリンクテーブルの対応レコードが削除されます。
が、画面上では消えない。と思って更新したら消えてたり、復活したり・・・

どういうこと?
一度Tomcatを再起動すると、削除された状態に落ち着くので
明らかにキャッシュが悪さしてると思うんだけど、
evictとかclearとかのやり方がわからん。
ためしにupdateの直後にevictかけたり、
Aテーブル読み込み前にclearしたりしたけど効果なし。
さっぱり分からん。


んで、ちょっと探ってみた。
見たのは↓
Hibernateトラブルシューティング
hibernateを利用してはいけない5つのシチュエーション
Hibernate 入門記
ratio - rational - irrational HibernateのSession#update(Object)
Hibernateドキュメント 第9章 永続データの操作

Hibernateトラブルシューティングの内容(私が必要としていることろ)は要約すると、
-Session#delete()を呼び出す前にSession#evict()を呼び出すべし。
と言うことだった。今回はupdateなのであまり関係ないっちゃないのだが・・・ とりあえず、Hibernateの一時・永続・分離オブジェクトの分類が見れただけでも良かったとしよう。
そのあとは、hibernateがいかに悪いか書いてある記事を見たり、入門記を見たり。

Session#update()で検索したら、
update()はSQLのupdateと対応しないと書かれているページを見つけたが、
それは永続オブジェクトの変更はcommit時に勝手にupdateされるということで、Session#update()を呼ぶこと自体が悪さをするわけではないらしい。
明示的という意味で呼び出すべきだと私は思うが。
Hibernateドキュメントには更新・追加のどちらかが実行されるような処理にはsaveOrUpdateを使えと書いているように見えた。
まーつまりは、更新時にはupdateを、追加時にはsaveを呼べと。そういうことだろう。

とりあえず、いろいろ書いたが解決策は見つからず。
明日は調査で時間を食われそうだ。