これはシーケンスです:
- App1: ID=1 のデータベースにエンティティを永続化します。問題ない。
- App2: 外部アプリケーションは、ID=1 の同じレコードを削除します。問題ない。
- App1: 前に App2 によって削除されたエンティティを再度永続化しようとします。ここでは、レコードがまだデータベースにあるかのように、"IntegrityConstraintViolation" という例外をスローし、2 回挿入していますが、そうではありません。
問題は、EntityManager がキャッシュを使用してデータベースの整合性を検証していることです。そして、どういうわけか、私が電話した後も
getEM().getEntityManagerFactory().getCache().evictAll(); or
getEM().clear();
EntityManager は何らかの形でそのレコードをキャッシュに保持しており、そのキャッシュをクリアする方法についてのアイデアが不足しています。私が見つけた 1 つの回避策は、App1 から呼び出すことでした。
getEM().remove(entity.class, id);
また、データベースと EntityManager キャッシュからもレコードを効果的に削除します。しかし、これはポイントではありません。検証のためにキャッシュを使用していることを証明するだけですが、「別のアプリケーションから削除された後、レコードを再度保持できない」という主な問題は解決しません。
ところで、私もエンティティを更新しようとしましたが、どちらも機能しません。エンティティが管理されていないという例外がスローされます。
誰でもこれを解決する方法について何か考えがありますか?