我正在尝试启用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)
的{{1}}运行Business
时,不会发出查询来加载id
,但会查询Business
。
我知道Address是关系所有者,并且在Business缓存条目中没有Address
信息,但是无法通过应用与* ToMany关系相同的机制来解决此问题,创建每个字段一个新的缓存区域?假设业务1与地址2相关,则在第一次加载后,缓存中将包含以下区域和条目:
Address.id
我试图通过用Business
Business#1 -> [business model]
Business.address
Business.address#1 -> [2]
Address
Address#2 -> [address model]
注释Address.business
和用@NaturalId
注释Address
类来使其工作。创建并填充了缓存区域,但是@NaturalIdCache
不使用它。
我的session.get(Business.class, id)
模型具有更多的OneToOne关系,其外键在另一侧(不是业务),并且我们必须一次列出多个关系,因此数据库服务器必须为每个HTTP请求处理数十个查询。
我已经阅读了《 Hibernate用户指南》,Vlad Mihalcea对2LC及其内存脱水格式的说明,Baeldung的说明以及其他一些StackOverflow答案,并且找不到解决此问题的方法。