【发布时间】:2014-10-22 03:00:20
【问题描述】:
我对 EclipseLink (2.5.0) QueryCaching 有问题,或者更准确地说,如果将对象插入数据库,查询缓存会失效。 如果我缓存实体 A 的查询并直接插入或更新实体 A,我可以正常工作。
但是让我们假设有一个实体 B 引用 @OneToMany(mappedBy = " a", orphanRemoval = true, cascade = CascadeType.ALL) 来自 A. A 拥有一个简单的 List bs; 带有注释。 如果我将一个新的 B 对象添加到 A 上的集合 bs 中,然后将 A 与 entityManager.merge() 合并;正确插入 B ... SQL 被执行。 对同一事务中所有 B 的 Where “某物”的缓存(命名)查询的后续执行不会返回刚刚插入的对象。
显然,命名查询的 QueryCache 没有更新,因为 B 对象不是显式插入的,而是通过 A 的级联插入的。
我找到了http://www.eclipse.org/eclipselink/api/2.5/org/eclipse/persistence/queries/QueryResultsCachePolicy.html#setInvalidationClasses(java.util.Set) 但我不知道如何使用它。据我了解,我应该能够将 A.class 添加到命名查询的 InvalidationClasses 中。但是 entityManager.createNamedQuery() 不提供设置 QueryResultsCachePolicy 的方法。
遗憾的是,QueryCaches 上的 Eclipselink 文档已经过时,并且没有引用使用的 2.5.0 版。
顺便说一下,我使用persistence.xml 中的提示为所有命名查询启用查询缓存。我通过http://java-persistence-performance.blogspot.co.at/2013/06/cool-performance-features-of.html 找到了这个特性,而且似乎没有官方的 Eclipselink 文档。尤其不是“查询缓存的自动失效”。
请就这个话题给我建议。
提前致谢。
【问题讨论】:
标签: java caching jpa eclipselink