2016-03-31 1 views
0

私は、IDなどの主要顧客でオブジェクトをキャッシュする方法のレベルのキャッシュインスタンスフィールドをキャッシュキーにしていますか?

public class Customer { 

private Long id; 

@Cacheable("customer",key="this.id") 
public CustomerAddress findCustomerAddress() {...} 

} 

ためorg.springframework.cache.annotation.Cacheableを使用してメートル。しかし、私はメソッドパラメータとしてIDを持っていません。私はインスタンスフィールドとして持っていますか?

あなたは簡単にそれを行うことはできませんし、上記のコードはIMO 2人の臭いがあり
+1

それぞれの「顧客」は、Springで管理されていますか?より一般的なアプローチは、ドメインオブジェクト(通常はSpringによって管理されない)上ではなく、サービス/ DAO層で '@ Cacheable'を使用することです。つまり、 'findCustomerAddress'をサービスレイヤーに移動し、ユーザーのIDを入力パラメーターとして送信することで、この問題を解決できます。 – kryger

+0

はい、お客様は春に管理されたBeanです。このコードはサービスレイヤーにのみ存在します。私はちょうど私が達成したいものを与えた – emilly

+0

CustomerAddress.idはキャッシュキーとして使用するプロパティですか? –

答えて

0

  • あなたはキャッシュしようとしているオブジェクトがないcustomerキャッシュ
  • addressをキャッシュしようとしています独自のアイデンティティを持っていないようです。その後、むしろ、あなたはすでにあなたの元の質問に素晴らしいコメントを持っていたし、オブジェクトあなたように、私はあなたの現在の設計を検討するために、あなたをお勧めしたい(一つを有する)Customerではなく、サブコンポーネント

をキャッシュしたいですキャッシュには独自のIDがあります。あなたができない、またはしない場合、常に方法があります。

@Cacheable(cacheNames = "customer", keyGenerator="customerKeyGenerator") 
public CustomerAddress findCustomerAddress() {...} 

} 

そして、いくつかの@Configurationクラス

@Bean 
public KeyGenerator customerKeyGenerator() { 

} 

KeyGeneratorのAPIは十分に簡単です。たとえば、対象のインスタンスがCustomerであることを確認し、id値を取得できます。

関連する問題