Как использовать Cacheable, используя идентификатор объекта результата? - PullRequest
0 голосов
/ 02 января 2019
public class MyClass{
    @Id
    @Column(name = "id", nullable = false)
    Long id;

    private AnotherClass anotherClass;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "another_id")
    @Cacheable(value = "getAnotherClass", unless = "#result == null", key = "#id")
    public AnotherClass getAnotherClass(){
        return anotherClass;
    }
}

public class AnotherClass{
    @Id
    @Column(name = "id", nullable = false)
    Long id;
}

Есть 2 класса. MyClass содержит внешний ключ для AnotherClass.

Мне нужно кэшировать getAnotherClass таким образом, чтобы он кэшировал, используя id из AnotherClass.

Как это сделать?

1 Ответ

0 голосов
/ 02 января 2019
  1. Spring @ Cacheable нельзя использовать без параметра метода .Когда метод, аннотированный @Cacheable, вызывается в первый раз, он запускается, и его возвращаемое значение сохраняется в Cache с использованием ключа [параметр экземпляра, переданного как параметр метода].В следующий раз, если метод вызывается с использованием того же ключа [например, того же параметра], результат возвращается непосредственно из Cache, без выполнения метода.

  2. Вы пытаетесь смешать ORM(hibernate) с пружинным кешем, что кажется плохой идеей, вместо этого вы можете использовать кэш второго уровня, предоставляемый hibernate , относитесь https://www.journaldev.com/2980/hibernate-ehcache-hibernate-second-level-cache

  3. Если вы все еще хотите использоватьSpring кешируется, напишите сервис для реализации Spring Caching.Имейте условие, чтобы проверить, доступен ли объект в хранилище кэша, иначе извлекайте, используя ссылку ORM (раздел «Объединение @CachePut и @Cacheable для оптимизации использования кэша» в https://www.foreach.be/blog/spring-cache-annotations-some-tips-tricks)

...