Vous ne pouvez pas faire facilement que et le code ci-dessus a deux odeurs OMI:
- Vous essayez de mettre en cache un
address
dans un cache customer
- L'objet que vous essayez de cache ne ne semble pas avoir sa propre identité. Vous seriez alors en cache plutôt le
Customer
(qui a une) plutôt qu'un sous-composante
Vous avez déjà eu de grands commentaires à votre question initiale et je vous suggère de revoir votre conception actuelle de sorte que l'objet le cache a sa propre identité. Si vous ne pouvez pas ou ne voulez pas, il y a toujours un moyen.
@Cacheable(cacheNames = "customer", keyGenerator="customerKeyGenerator")
public CustomerAddress findCustomerAddress() {...}
}
Et puis dans une @Configuration
classe
@Bean
public KeyGenerator customerKeyGenerator() {
}
L'API de KeyGenerator
est assez simple. Vous pouvez par exemple vérifier que l'instance cible est Customer
, puis récupérer la valeur de l'ID.
Chaque 'Client' est-il géré par Spring pour commencer? Une approche plus habituelle consiste à utiliser '@ Cacheable' dans votre couche de service/DAO, pas directement sur les objets de domaine (qui ne seraient généralement pas gérés par Spring). En d'autres termes: vous résolvez ce problème en déplaçant 'findCustomerAddress' sur la couche de service et en envoyant l'ID de l'utilisateur comme paramètre d'entrée. – kryger
Oui, le client est un haricot géré par le printemps. Ce code est en couche de service uniquement. Je viens de donner un exemple de ce que je veux réaliser – emilly
Est-ce que CustomerAddress.id est la propriété que vous voulez utiliser comme clé de cache? –