我正在尝试使用EclipseLink缓存。 我在persistence.xml中启用了shared-cache-mode = ENABLE_SELECTIVE,所以当我使用@Cacheable(true)时,实体会被缓存。现在,我希望在版本过时时使其工作,以便刷新enity。
我已设置乐观锁定字段
@Version
@Column(name="optLock")
private int versionNum ;
当我尝试保存具有旧版本号的实体然后数据库我将获得异常时,这是有效的。
所以当我添加注释以启用缓存和刷新
时@Cacheable(true)
@Cache(size = 500, alwaysRefresh = true, refreshOnlyIfNewer = true)
实体不会被缓存。我启用了eclipselink.profiler,我可以看到没有为此实体创建缓存,并且缺少Counter:CacheHits和Counter:CacheMisses日志。
当我删除
@Cache(size = 500, alwaysRefresh = true, refreshOnlyIfNewer = true)
实体再次被缓存,但是直接在数据库中完成的任何更改(以及增加optLock字段)都不会通过。
我忘了她?或者我应该考虑什么来使这个工作?我一直在阅读的文档似乎应该有用。
答案 0 :(得分:1)
@Cache覆盖@Cacheable,因为你没有在@Cache中启用缓存,它会获得持久性单元默认为不缓存。
添加,
@Cache(isolation=SHARED, ...)
到你的注释。
还请记录一个错误,EclipseLink应该足够智能以查看@Cacheable并将其用作默认设置,因为@Cache中没有隔离设置,或者至少报告警告。