保存具有一对多关系的实体时更新Spring Cache

时间:2018-05-02 11:26:15

标签: spring spring-data-jpa 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
}

我还有两个相应的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表中。 之后我希望用a.getbSet()中的每个元素填充我的bCache,其中键为b.name,值为B实例。

如何才能使此功能正常工作?

------------------------- UPDATE --------------------- ------

为了满足我的需求,我希望缓存看起来像:

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

如果我想在保存到A时将其保存到缓存中,我如何使用SPEL定义cachePut的密钥(记住A包含B个实例集)? 可能吗?

感谢。

0 个答案:

没有答案