带有Spring Data Rest Repository的Spring Cache缓存了异常保存的结果

时间:2017-02-20 14:15:59

标签: spring caching repository

我有一个Spring Data Rest存储库,我想用它来使用Spring Caching。

当没有错误时,缓存按预期工作。但是,如果save的结果是验证异常,则实体将被缓存,即使它未写入数据库。

SDR存储库

@RepositoryRestResource(collectionResourceRel = "businessUnits", path = "businessUnits")
public interface BusinessUnitRepository extends JpaRepository<BusinessUnit, UUID> {

@Override
@Cacheable(value = "lookups", cacheManager = "vaultCache")
BusinessUnit findOne(final UUID id);

@Override
@CacheEvict(value = "lookups", cacheManager = "vaultCache", allEntries = true, beforeInvocation = true)
BusinessUnit save(BusinessUnit entity);

如果我在新业务单位下面张贴邮件正文,则会正确保存。检索记录的第一个GET按预期命中数据库,后续GET来自缓存。

{
"name": "Test_Business_2",
"effectiveDate": "2019-12-16T11:11:11.111+0000",
"expirationDate": "2020-12-16T11:11:11.111+0000",
"businessUnitType": "/businessUnitTypes/38faf33c-5454-4245-bc69-2b31e510fa6b"
}

BusinessUnit Entity在effectiveDate字段上的值为空。

@NotNull
@Column(name = "effective_date")
private Timestamp effectiveDate;

当我使用null effectiveDate修补业务单位时。响应是错误,记录异常并且不更新数据库。

{
"effectiveDate": null
}

当我查询数据库时,我看到记录未更新

NAME            EFFECTIVE_DATE      EXPIRATION_DATE
Test_Business_2,2019-12-16 06:11:11,2020-12-16 06:11:11

但是,当我在businessUnits端点上执行GET时。未命中数据库以读取记录,并返回null effectiveDate。

{
"createDate": "2017-02-20T13:38:00.386+0000",
"lastModifiedDate": "2017-02-20T13:38:00.386+0000",
"effectiveDate": null,
"expirationDate": "2020-12-16T11:11:11.111+0000",
"name": "Test_Business_2",  ...

因此,似乎引发异常的数据存储在缓存中。

我需要更改哪些内容,以便在保存时未更新数据库时,该值不会保存在缓存中?

我感谢任何帮助或建议。感谢。

1 个答案:

答案 0 :(得分:1)

您缓存的key和您驱逐的key不匹配。您需要定义如何从BusinessUnit获取ID,例如:

@CacheEvict(key = "#entity.id"

或提供了解您的域模型的KeyGenerator