我似乎对 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] 中更改数据 - 什么都没有。我必须重新启动应用程序才能获取当前和新的记录来自数据库。