У меня есть 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.
Как мне заставить эту функцию работать?
------------------------- UPDATE --------------------- ------
Чтобы ответить на мои потребности, я хочу, чтобы кеш выглядел следующим образом:
KEY | VALUE
name1 | B(name1)
name2 | B(name2)
Как я могу использовать SPEL для определения ключа для cachePut, если я хочу сохранить его в кеше, когда я выполняю сохранение в A (помните, что A содержит множество экземпляров B)?
Является ли это возможным?
Спасибо.