X项目包含以下部分:
一个。Spring Data存储库具有单独的方法,例如:
@Cacheable(value = "xobjects", unless = "#result == null") XObject findByParamA(String paramA); @Cacheable(value = "xobjects", unless = "#result == null") XObject findByParamB(String paramB); @CacheEvict("xobjects") <E extends XObject> E save(E entity);
b。hibernate方式也使用“ xobjects”缓存。
问题#1 由于有两种添加对象以缓存的方法,因此可能是同一对象出现2次的情况。如何更好地解决这个问题?例如,使用结果对象中的键。就像是:
键=“#result.id”
问题#2 我不想在调用“保存”方法时从缓存中逐出所有对象,但是我不确定当前的实现是否会起作用。“保存”方法将xobject作为输入,因此CacheEvict会将其用作驱逐的密钥,并且我预期不会发生任何事情。在这里,我相信能够使用与上述魔术钥匙相同的方法会很好。
更新#1 实际上我认为我的建议可以奏效,这是一个示例-https: //github.com/zhangkaitao/spring4-showcase/blob/master/spring- cache/src/main/java/com/sishuok/spring/ service / UserService2.java 但是我需要先对其进行测试。稍后将共享结果。
您的方法要么行不通,要么很难维护。除了需要手动维护缓存之外,如果希望管理实体实例,则还需要将它们重新合并到每个新的Hibernate会话(持久性上下文)中,因为从您自己的缓存返回的实体将始终分离。
最好的方法是使用Hibernate二级缓存,它将自动为您执行缓存条目生命周期作业。