休眠二级缓存逐出特定实体

时间:2020-03-01 09:25:27

标签: java spring hibernate

我有一个使用休眠二级缓存进行缓存的实体。我想在使用特定方法后从缓存中逐出(或刷新)特定实体。怎么做?

公司:

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Company implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private Boolean hidden;

    @OneToMany(mappedBy = "company", fetch = FetchType.EAGER)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Treatment> treatments = new HashSet<>();

    ...
}

方法:

// @CacheEvict(value = "com.bloombooking.app.domain.Company", allEntries = true) -> Works but evict all entries
@CacheEvict(value = "com.bloombooking.app.domain.Company", key = "#treatment.company") // Doesn't work
public Treatment save(Treatment treatment) {
    log.debug("Request to save Treatment : {}", treatment);
    return treatmentRepository.save(treatment);
}

1 个答案:

答案 0 :(得分:0)

摘自Hibernate 2nd Level文档:

此语法在DAO层中应sessionFactory.getCache().evictEntity(class, id)有效。

例如:

@Repository
public class TreatmentRepository {

  @Autowired
  private SessionFactory sessionfactory;

  public Treatment save(Treatment treatment) {
    Session session = sessionfactory.currentSession();
    Treatment t = session.save(treatment); 
    sessionFactory.getCache().evictEntity(Treatment.class, t.getId());
    return t; 
  }

}