代码之家  ›  专栏  ›  技术社区  ›  Chris Williams

休眠/JPA缓存查找值

  •  1
  • Chris Williams  · 技术社区  · 6 年前

    我们有代表查找值(州、国家代码等)的JPA实体。经常调用以获取 List 使用 org.springframework.cache.annotation.Cacheable 注释(如适用)。

    我们还有与这些查找实体有关系的实体,定义如下:

    @Entity
    @Table(name = "Address")
    public class AddressEntity {
        // ...
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "STATE_CD", referencedColumnName = "CD")
        @NotNull
        private StateEntity state;
        // ...
    }
    

    当我们加载其中一个实体,然后调用相关查找的getter时,Hibernate会再次点击数据库来加载该值。当我们有了地址并进行 getState 在该地址上,我们访问本地缓存以获取该信息。我们如何使用Hibernate/JPA实现这一点?

    // Get address:
    Address address = addressRepo.findOne(addressId);
    
    // Get the state - this causes an additional query to hit the database:
    State state = address.getState();
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   crizzis    6 年前

    获取类型在这里并不重要。Hibernate的二级缓存行为是将的ID缓存到一个关联目标,而不是目标本身。

    为什么不制作 StateEntity 它本身 @Cacheable ? 这似乎是一个很好的候选人,因为 国家实体 AddressEntity