我似乎对NamedQuery有一个奇怪的缓存问题(我猜),我似乎无法解决。
以下是一些细节:
我有一个Process,ProcessForm和ProcessFormModule表以及相关实体 - 它们都使用标准的@JoinColumn注释进行链接:
@JoinColumn(name = "process_id", referencedColumnName = "id", insertable = false, updatable = false)
@OneToMany(fetch = FetchType.EAGER)
private List<ProcessForm> processForms;
然后我有需要以编程方式链接到特定模块的Elements,因为我需要在运行时填充列表。这需要在运行时填充的原因是我为特定语言的每个模块都有更多元素,并且在表单启动时,需要填充与给定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。