如何使用结果对象的ID使用Cacheable?

时间:2019-01-02 06:50:01

标签: java ehcache spring-cache

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的{​​{1}}缓存id的方式。

如何做到?

1 个答案:

答案 0 :(得分:0)

  1. Spring 没有方法参数不能使用@Cacheable 。 第一次调用带有@Cacheable注释的方法时,该方法将被执行,并使用键[作为方法参数传递的实例的参数]将其返回值存储在Cache中。 下次,如果使用相同的键(例如,相同的参数)调用该方法,则结果将直接从Cache中返回,而无需执行该方法。

  2. 您正在尝试将ORM(hibernate)与spring缓存混合使用,这似乎是个坏主意,相反,您可以利用hibernate提供的二级缓存,请参考{{3} }

  3. 如果您仍然想使用spring cacheable,请编写服务以实现spring cache。有条件检查是否在缓存存储库中有可用的对象,否则请使用ORM进行获取(请参阅https://www.journaldev.com/2980/hibernate-ehcache-hibernate-second-level-cache中的“组合@CachePut和@Cacheable以优化缓存使用”一节)