EclipseLink JPA『is mapped to a primary key column in the database. Updates are not allowed.』


JPAの開発で『is mapped to a primary key column in the database. Updates are not allowed.』というエラーが出る場合、おそらく原因はいろいろあるのだろうけど、自己解決したのでメモ。

既に存在しているレコードに対して、EntityManager.find で atache したのちプライマリキーを上書きした状態で、merge / flush を行うとなるようです。

find して存在するレコードに更新かける場合はプライマリキーを書き換えないようにしましょう。

2016/4/26追記:

上記記載内容でも解決できずまだエラーログが掃かれていたので調査した結果を記載。EntityManagerを使いまわしでいろんなEntityを入れてmerge/flushしてました。emTransaction.commit / rollback 後は使用しなくなったEntitiyはキャッシュクリアを明示的にしないとずっと保持し続けるようで、これが悪さをしていました。

処理が遅くなるけど、 1テーブル処理が終わったらcommit/rollbackと同時に毎回em.clear();するようにしたらタイトルのエラーが出なくなりました。

またEntityのキャッシュについては、アノテーションによるキャッシュとpersistence.xmlによる設定ができるようです。前者の方がEntity毎に管理できるのでよさそうですね。

キャッシュいついての記事。