2017-02-20 1 views
1

私はSpring Cachingを使用したいSpring Data Restリポジトリを持っています。Spring Data Restリポジトリを使用したSpringキャッシュは、例外時の保存結果をキャッシュしています

エラーがない場合、キャッシュは正常に動作します。ただし、保存の結果が検証例外の場合、エンティティはデータベースに書き込まれなくてもキャッシュされます。私は新しいビジネスユニットの下にメッセージ本体を投稿する場合

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エンティティは、effectiveDateフィールドにnullではありません。私はヌルeffectiveDateとのビジネスユニットにパッチを適用

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

。応答はエラーです。例外が記録され、データベースは更新されません。

{ 
"effectiveDate": null 
} 

私はデシベルを照会するとき、私はbusinessUnitsエンドポイントでGETを行う際に、レコードが、しかし

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

を更新されませんでした参照してください。レコードを読み取るためにデータベースにヒットせず、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", ... 

したがって、例外がスローされる原因となったデータは、キャッシュに格納されているようです。

保存時にデータベースが更新されないときに、値がキャッシュに保存されないように変更する必要はありますか?

私は何か助けやアドバイスをいただきありがとうございます。ありがとう。

+0

問題の解決策が見つかりませんでしたが、回避策が見つかりました。エラーが表示された場合、例外がスローされていますが、キャッシュは追い出されていません。例外を処理するメソッドでは、プログラムでキャッシュをクリアできます。 キャッシュキャッシュ= cacheManager.getCache( "lookups"); cache.clear(); 次に、キャッシュはクリアされ、「例外」値は含まれません。 –

答えて

1

keyキャッシュしておき、keyが一致しません。あなたは、例えば、BusinessUnitからIDを取得する方法を定義する必要があります。

@CacheEvict(key = "#entity.id" 

またはあなたのドメインモデルを理解KeyGeneratorを提供しています。

+0

beforeInvocation設定に関係なく同じ結果が得られます。私はそれを真実に、そして偽に設定しようと試みました。 –

+0

申し訳ありません、あなたの注釈を間違って読んでいます – OrangeDog

+0

@EricSmithが更新されました – OrangeDog

関連する問題