休眠二级缓存不适用于OneToOne关联

时间:2020-04-15 20:26:01

标签: java hibernate caching hibernate-cache

我正在尝试启用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答案,并且找不到解决此问题的方法。

0 个答案:

没有答案