web-dev-qa-db-fra.com

Spring cache tous les éléments de la liste séparément

J'essaie d'ajouter la mise en cache à une application CRUD, j'ai commencé à faire quelque chose comme ceci:

@Cacheable("users")
List<User> list() {
    return userRepository.findAll()
}
@CachePut(value = "users", key = "#user.id") 
void create(User user) {
    userRepository.create(user)
}
@CachePut(value = "users", key = "#user.id") 
void update(User user) {
    userRepository.update(user)
}
@CacheEvict(value = "users", key = "#user.id") 
void delete(User user) {
    userRepository.delete(user)
}

Le problème que j'ai est que j'aimerais que les opérations de création/mise à jour/suppression puissent mettre à jour les éléments déjà stockés dans le cache pour l'opération list() (notez que list() ne tire pas de la base de données mais un moteur de données), mais je ne suis pas en mesure de le faire.

Je voudrais mettre en cache tous les éléments retournés par list() individuellement afin que toutes les autres opérations puissent mettre à jour le cache en utilisant #user.id. Ou peut-être, effectuez toutes les opérations pour mettre à jour la liste déjà stockée dans le cache.

J'ai lu que je pouvais expulser tout le cache lors de sa mise à jour, mais je veux éviter quelque chose comme:

@CacheEvict(value = "users", allEntries=true) 
void create(User user) {
    userRepository.create(user)
}

Existe-t-il un moyen de créer/mettre à jour/supprimer des valeurs dans une collection mise en cache? Ou pour mettre en cache toutes les valeurs d'une collection en tant que clés individuelles?

7
Federico Piazza
8
John Blum