У меня есть 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)? Является ли это возможным?
Спасибо.
Cache
иCacheManager
для вашего провайдера, чтобы включить эту возможность. ПользовательскийCacheManager
вернет экземпляр вашего пользовательского экземпляраCache
для обработки вложенного агрегата, что мало чем отличается от того, что демонстрируют мои предыдущие сообщения, связанные с этой проблемой. - person John Blum   schedule 04.05.2018