3

我正在尝试启用 Hibernate 的二级缓存,但无法避免针对 OneToOne 关系发出多个查询。

我的模型是:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Business {

    @OneToOne(mappedBy = "business", cascade = {CascadeType.REMOVE}, fetch = FetchType.EAGER)
    private Address address;
}

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Address {

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "business_id", unique = true, nullable = false, foreignKey = @ForeignKey(name = "fk_business_id"))
    private Business business;
}

当我在缓存中使用 id运行session.get(Business.class, id)时,不会发出加载查询,但会发出.BusinessidBusinessAddress

我知道 Address 是关系所有者,并且在 Business 缓存条目中没有Address.id信息,但是通过应用与 *ToMany 关系相同的机制,为每个字段创建一个新的缓存区域,不能解决这个问题吗?假设业务 1 与地址 2 相关,在第一次加载后,我的缓存中会有以下区域和条目:

Business
  Business#1         -> [business model]
Business.address
  Business.address#1 -> [2]
Address
  Address#2          -> [address model]

我试图通过使用注释Address.business@NaturalId使用. 缓存区域已创建并填充,但不使用它。Address@NaturalIdCachesession.get(Business.class, id)

我的Business模型有更多的 OneToOne 关系,其外键在另一端(不是业务),我们必须一次列出几个,因此数据库服务器必须处理每个 HTTP 请求的数十个查询。

我已经阅读了 Hibernate 的用户指南、Vlad Mihalcea 对 2LC 及其内存脱水格式的解释、Baeldung 的解释以及其他几个 StackOverflow 答案,但找不到解决此问题的方法。

4

0 回答 0