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毎に管理できるのでよさそうですね。

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

 


投稿者: cova

ザムウ取締役CTO。2010年に大阪から香川へ移住しフリーランスSEとして活動をはじめる。領域としてWeb系から組込み系+サーバ構築。中小企業基盤整備機構にて中小企業の経営支援と、小学校にてICT講習を務める。2021年現在、子育て支援NPO理事、短大専任講師を兼任する。 【主な資格】経営学修士(MBA)修了、国家試験応用情報技術者、国内初の夫婦ITコーディネーター。 その他、2021年4月:2児(3歳・0歳)の父に就任。 #赤ちゃんから学ぶ経営学 を配信。