当前位置: 首页 > 知识库问答 >
问题:

Spring存储库:@CacheEvict on save方法

司寇祖鹤
2023-03-14

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

我试图通过阅读此线程使用自定义实现来覆盖方法,但我不想重写方法实现,只需调用具有更多行为的默认方法。提供的解决方案都不适合我的情况,或者需要太多的自定义。

@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生成实现。

有什么建议吗?

共有1个答案

蒲昀
2023-03-14

建立它是哑巴。刚刚删除了@Transactional(只读=true)。它阻止了保存工作。

因此,只要重写方法的签名就足以添加一些装饰器,而不必关心实现。

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

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

 类似资料:
  • 我需要使用spring@Cacheable注释缓存对MongoDB的调用: 不幸的是,使用@Cacheable注释接口中的任何方法都会导致以下异常: 我正在寻找一种方法来缓存对DB的调用(这相当昂贵)。有什么想法吗?

  • 我正在尝试实现一个简单的REST服务,该服务基于具有Spring启动和Spring数据Rest的JPA存储库。(请参阅此教程)如果将以下代码与 gradle 一起使用,则运行良好: 为了让事情变得更简单,我使用Spring boot CLI(“Spring run”命令)尝试了相同的代码。 不幸的是,这似乎不起作用@RepositoryRestResource似乎无法像@RestControlle

  • 尝试从方法名生成查询时出错。然而,我可以使用其他已经在那里的。...等等。知道为什么吗? 实体 存储库 应用程序.属性 方法关键字:https://docs.spring.io/spring-data/solr/docs/1.2.0.rc1/reference/htmlsingle/

  • 由于我对这个平台还不熟悉,所以我正在尝试找出Spring的工作方式。我有一个存储库声明如下: 我有几个查询方法在那里,但现在我想有另一个方法,不只是一个查询。该方法运行一个查询,如果找到一条记录,它就返回它,如果没有,它就用一些默认参数创建它。这种方法该何去何从? 我在文档中看到了自定义存储库实现,但因为它们与实际的是分开的,所以它们似乎不能访问数据库。

  • 我刚开始使用Spring和JPA/Hibernate,我会拔下我的头发。 这是我的: 谢谢你的帮助。

  • 我想使用Spring LDAP 设置多个 LDAP 存储库。我的目标是同时在所有存储库中创建或更新对象。 我使用LdapRepository Spring接口,我认为目前这是不可能的。 我想知道我是否可以创建自己的LdapRepository来扩展Spring,但是我不知道如何开始。 这是我的配置: 完整地说,一个存储库: 知道怎么做吗? 提前感谢任何帮助。