Javaバージョンあげたらorg.hibernate.HibernateException: identifier of an instance of was altered from xxx to null
仕事の都合上、アプリケーションのJava実行環境を
oracle製のJRE6からopen系のJRE7にバージョンアップすることになった。
すると、とある検索ロジックの処理で以下のようなhibernateエラーが発生。
org.hibernate.HibernateException: identifier of an instance of SampleModel was altered from xxx to null at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:58) at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:164) at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:120)
解決法
当方はDBにpostgresqlを使っているが、
どうやらView系のテーブルに検索いった後、キャッシュを削除せずに次の検索にいくとエラーが出てるらしかった。
よってwebでいろいろ調べた結果、以下のようにView系の検索をsession.evict()してやると解決した。
// 検索(ViewSearchUtil内でView系テーブルを検索していると仮定) ViewModel viewModel = ViewSearchUtil.searchView(session, viewCode); if(viewMode != null){ process(viewModel); session.evict(viewModel); } // evictしないとここでエラー HogeModel hogeModel = HogeSearchUtil.search(session, hogeCode);
疑問
なぜJRE6->JRE7にあげたら再現するようになったのか。。