Spring储存库:保存方法上的@CacheEvict

时间:2019-06-25 08:42:25

标签: java spring jpa caching

我想在存储库中的save / saveAll方法中添加一个@CacheEvict()装饰器。

我已尝试通过阅读此thread使用自定义实现来覆盖方法,但我不想重写该方法的实现,只需调用具有更多行为的默认方法即可。所提供的解决方案均不适用于我的情况,或者需要过多的自定义。

@Transactional(readOnly = true)
@Repository
public interface MyRepository extends JpaRepository<MyEntity, Long> {

   // This is working fine as its a custom query method
   @Cacheable(value = "ENTITIES")
   MyEntity findByCategory(String category);

   // This isn't working as it won't implement the function correctly. Save don't work anymore here.
   @CacheEvict(value = "ENTITIES", key = "#entity.hashCode()")
   <S extends MyEntity> S save(S entity);

}

我可以从方法的主体中手动调用缓存逐出,但是我不能仅仅重写save()方法并调用super.save(),因为我仅使用接口并让Spring生成实现。 / p>

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

找到了。这是假的。 刚刚删除了@Transactional(readOnly = true)。这阻止了保存工作。

因此,仅重写方法的签名就足以添加一些装饰器,而无需关心实现。

@Override
@CacheEvict(value = "ENTITIES", key = "#p0.getKeyWhateverItIs()")
<S extends Feature> S save(S entity);

是的,键值也是错误的,但与无效的save方法无关。