私は解決できないように見える NamedQuery に奇妙なキャッシングの問題があるようです (私は推測します)。
詳細は次のとおりです。
Process、ProcessForm、および ProcessFormModule テーブルと関連エンティティがあります。これらはすべて、次のような標準の @JoinColumn アノテーションを使用してリンクされています。
@JoinColumn(name = "process_id", referencedColumnName = "id", insertable = false, updatable = false)
@OneToMany(fetch = FetchType.EAGER)
private List<ProcessForm> processForms;
次に、実行時にリストを埋める必要があるため、特定のモジュールにプログラムでリンクする必要がある要素があります。これを実行時に入力する必要がある理由は、特定の言語のモジュールごとに多くの要素があり、フォームが開始されたときに、指定された URL パラメーターに関連する要素を入力する必要があるためです。
ProcessFormModule エンティティでフィールドを定義する方法は次のとおりです。単純なオブジェクト リストです。
@Transient
private List<Mle> mles;
このメソッドは、要素を埋めるために最終的に各モジュールに対して呼び出されます。
public List<Mle> getMLEsByMRL(Long moduleId, Long regionId, Long languageId) {
List<Mle> items = null;
Query query = em.createNamedQuery("Mle.findByMRL", Mle.class);
items = query
.setParameter("moduleId", moduleId)
.setParameter("regionId", regionId)
.setParameter("languageId", languageId)
.getResultList();
return items;
}
使用される NamedQuery は次のように定義されます。
@NamedQuery(name = "Mle.findByMRL", query = "SELECT m FROM Mle m WHERE m.moduleId = :moduleId AND m.regionId = :regionId AND m.languageId = :languageId")})
また、おそらく重要です。各マネージャーは、次のような AbstractManager から派生しています。
public abstract class AbstractManager {
@PersistenceUnit
protected EntityManagerFactory emf;
protected EntityManager em;
@PostConstruct
protected void initialize() {
em = emf.createEntityManager();
}
@PreDestroy
protected void cleanup() {
if (em.isOpen()) {
em.clear();
em.close();
}
}
}
ここで問題があります - このクエリに対してキャッシュを使用しないように強制しようとすると、何も機能していないようです。persistence.xml の変更、各 EntityManager へのプロパティの追加、NamedQuery のヒントを試してみました。クエリが実行される直前に evictAll を試してみました:
em.getEntityManagerFactory().getCache().evictAll();
私は古い結果を取得し続けます-しかし、このプログラムで埋められたリストだけです! アプリケーションの CRUD やその他の画面から何かを変更すれば、すべて問題ありません。ただし、モジュールで使用される要素を変更した場合 (エンティティを使用しているアプリ画面から、または DB [MySQL] で直接データを変更することによって) - 何もありません。最新の新しいレコードを取得するには、アプリを再起動する必要があります。 DBから。