Обновите Spring Cache при сохранении объекта с отношением один ко многим

У меня есть 2 объекта с отношением один ко многим следующим образом:

public class A {

  @ID
  private String id;

  @OneToMany(mappedBy = "a",cascade = CascadeType.ALL, orphanRemoval = true)
  private Set<B> bSet;
  //getters setters and constructors
}

public class B {

  @ID 
  private String name

  @ManyToOne
  @JoinColumn(name = "id",nullable = false)
  private A a;

  //getters setters and constructors
}

У меня также есть 2 соответствующих репозитория для A и B следующим образом:

@Repository
public interface BRepository extends JpaRepository<B,String> {

  @Cacheable(value = "bCache", key = "#p0")
  B findOneByName(String name);

  Set<B> findAllByNameIn(Set<String> names);

  @Override
  @CacheEvict(value = "bCache", key = "#p0")
  void delete(String name);
}

@Repository
public interface ARepository extends JpaRepository<A,String> {

}

Когда я делаю:

A a = new A("id1");
B b1 = new B("name1", a);
B b2 = new B("name2", a);
a.getbSet().add(b1);
a.getbSet().add(b2);

aRepository.save(a);

затем все объекты B вставляются в таблицу B в репозитории. После этого я хочу, чтобы мой bCache был заполнен каждым элементом в a.getbSet() с ключом b.name и значением экземпляра B.

Как я могу заставить этот функционал работать?

-------------------------ОБНОВИТЬ------------------------ ---

Чтобы ответить на мои потребности, я хочу, чтобы кеш выглядел так:

KEY   |   VALUE
name1 | B(name1)
name2 | B(name2)

Как я могу использовать SPEL для определения ключа для cachePut, если я хочу сохранить его в кеше, когда я выполняю сохранение в A (помните, что A содержит набор экземпляров B)? Является ли это возможным?

Спасибо.


person NetaliG    schedule 02.05.2018    source источник
comment
Этот вопрос мало чем отличается от предыдущих вопросов того же характера. См. здесь, например... stackoverflow.com/questions/47803120/   -  person John Blum    schedule 03.05.2018
comment
@JohnBlum спасибо за ссылки и ответ, я обновил свой вопрос, можно ли делать то, что я хочу?   -  person NetaliG    schedule 04.05.2018
comment
Да, это возможно, но вам нужно расширить абстракцию Spring Cache и CacheManager для вашего провайдера, чтобы включить эту возможность. Пользовательский CacheManager вернет экземпляр вашего пользовательского экземпляра Cache для обработки вложенного агрегата, что мало чем отличается от того, что демонстрируют мои предыдущие сообщения, связанные с этой проблемой.   -  person John Blum    schedule 04.05.2018
comment
@JohnBlum Спасибо, я использовал ваш пример здесь, чтобы решить мою проблему.   -  person NetaliG    schedule 05.05.2018