缓存对象,该对象派生自在Hibernate L2C中缓存的实体

时间:2017-11-24 11:16:46

标签: java spring hibernate caching

请考虑以下代码:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Foo {
  public @Id int id;
  public String bar;
}

public class FooDto {
  public String bar;
}

public class FooService {

  public FooDto getOne(int id) {
    return toDto(fooRepository.findOne(id));
  }

  public List<FooDto> getAll() {
    return fooRepositoy.findAll().stream()
      .map(this::toDto)
      .collect(toList());
  }

  private toDto(Foo foo) {
    FooDto fooDto = new FooDto();
    fooDto.bar = foo.bar;
    return foo;
  }
}

findOne()findAll()的结果由Hibernate的二级实体和查询缓存缓存。

我还想缓存派生的FooDto个对象/ getOne()getAll()的结果。每当更新L2C中的实体时,都必须更新对象。

我的想法是通过挂钩Foo @PostPersist@PostUpdate@PostRemove来自行维护缓存。这可行吗?

这可以用Spring Cache完成吗?或者还有另一种好方法吗?

1 个答案:

答案 0 :(得分:0)

在概念层面上回答更多问题,我不是Spring或者是hibernate的大师。

  

我的想法是通过挂钩Foo的@PostPersist,@ PostUpdate和@PostRemove来自己维护缓存。这可行吗?

这还不足以保证数据的一致性。

这也可能会使您的代码只能在单个JVM上运行。

还有一个假设,即只能通过休眠或应用程序更新数据库。

  

或者还有另一种好方法吗?

如果你依赖于一致性,(更好)不要做任何自己的缓存。

如果不需要一致性,最好是非常简单,并使用一段时间后自动刷新的缓存(写入后TTL /到期)。

除此之外,我可以理解这个要求,并希望看到一个很好的解决方案。然而,它有点像增加太多的复杂性并且过度工程化。