我正在尝试启用 Hibernate 二级缓存,但无法避免为一对一关系发出多个查询。
我的模型是:
@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;
}
当我跑步时session.get(Business.class, id)
与Business
带身份证id
在缓存中,不发出加载查询Business
但它确实是为了Address
.
我知道地址是关系所有者,并且在业务缓存条目中没有Address.id
信息,但是通过应用与 *ToMany 关系相同的机制,为每个字段创建一个新的缓存区域,是否可以解决这个问题?假设业务 1 与地址 2 相关,第一次加载后我的缓存中将有以下区域和条目:
Business
Business#1 -> [business model]
Business.address
Business.address#1 -> [2]
Address
Address#2 -> [address model]
我尝试通过注释使其工作Address.business
with @NaturalId
和Address
与 一起上课@NaturalIdCache
。缓存区域已创建并填充,但session.get(Business.class, id)
不使用它。
My Business
模型有更多的 OneToOne 关系,其外键位于另一端(而不是业务),我们必须一次列出几个,因此数据库服务器必须处理每个 HTTP 请求的数十个查询。
我已经阅读了 Hibernate 的用户指南、Vlad Mihalcea 对 2LC 及其内存脱水格式的解释、Baeldung 的解释以及其他几个 StackOverflow 答案,但找不到解决此问题的方法。