Java Hibernate/JPA缓存查找值

Java Hibernate/JPA缓存查找值,java,hibernate,jpa,caching,Java,Hibernate,Jpa,Caching,我们有代表查找值(州、国家代码等)的JPA实体。经常调用以获取这些值的列表s的方法在适当的情况下使用org.springframework.cache.annotation.Cacheable注释进行缓存 我们还有与这些查找实体有关系的实体,定义如下: @Entity @Table(name = "Address") public class AddressEntity { // ... @ManyToOne(fetch = FetchType.LAZY) @JoinCo

我们有代表查找值(州、国家代码等)的JPA实体。经常调用以获取这些值的
列表
s的方法在适当的情况下使用
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();

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


为什么不将
StateEntity
本身
@Cacheable
?这似乎是一个很好的选择,因为
StateEntity
的实例应该比
AddressEntity

少得多。为此,您可能需要使用Hibernate的二级缓存,而不是Spring的一般缓存机制。我很难理解这个问题:这不是一个简单的问题,懒惰获取关系导致hibernate再次命中db吗?@Kayaman,是的,听起来不错。我得去看看。我们只希望缓存某些实体。@Zeromus,是的,这是一个延迟加载问题,但我们希望Hibernate缓存某些延迟加载的实体,以便它们在第一次加载后不会从数据库中加载。我们还希望控制缓存的行为。