JPAが古いデータをキャッシュに保持することに問題があり、見つけた解決策を試しましたが、ポップアップし続けます!
とにかく、最初は効率のために 1 つの Entity Manager インスタンスを再利用しました。説明されている問題に初めて遭遇したとき、トランザクションごとに新しいエンティティ マネージャーが作成されるようにコードを変更しました。
/** This method is called every time a transaction is made. */
public static EntityManager createFreshEntityManager() {
try {
return Persistence.createEntityManagerFactory(puName)
.createEntityManager();
}
catch (Exception e) {
logStuff(e);
return null;
}
}
ただし、これで問題が解決するわけではありません。
JDBC を使用してテーブルを切り捨て、主キーをリセットすると、特定の新しく作成されたオブジェクトに古い変数値が含まれていることがよくあります。私が持っている疑いの 1 つは、主キーをリセットすることが原因である可能性があるということですが、繰り返しになりますが、トランザクションごとに新しい Entity Manager が既にあるため、まったく問題にはなりません。
DB エンティティが関数スコープ外のアプリケーションに格納されることはなく、必要に応じて常に DB から直接クエリが実行されるため、コードの問題ではないと確信しています。
EntityManager.clear() の使用についても読んだことがありますが、マルチスレッド プログラムを台無しにする可能性があるため、それほど残忍なことはしたくありません。
JDBC の代わりに JPA を使用して TRUNCATE を実行し、すべてのオブジェクトを一度に取得してから手動で 1 つずつ削除することを考えましたが、それは非効率的です... しかし、それでもボトルネックにはなりません。ただし、JDBCを使用してそれを行うことで違いが生じるかどうかはわかりません。