個人でWebサービス作る人の雑記ブログ

Webサイトを個人で作ってる人が人の役に立ちそうなことを書いていく雑記ブログです

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にあげたら再現するようになったのか。。