为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate 初始化一组/实体集合

Hibernate 初始化一组/实体集合

慕莱坞森 2021-09-03 16:50:58
我有一个查询,在页面中获取一个实体。每个页面包含 100 个实体。对于这 100 个实体,我需要获取一些惰性获取的嵌套实体。发生的情况是,我为主要实体执行了 1 个 SELECT,然后为嵌套实体执行了 100 个 SELECT。我正在寻找一种方法来批量初始化这 100 个嵌套的,这样我总共有 1 个 SELECT 用于主实体,1 个用于嵌套实体。我的结构如下,如果不改变我更喜欢(我们在 EAGER fetch 中遇到了很多问题)public class MyMainEntity {    private NestedEntity nested;    @Override    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL,  orphanRemoval = true)    @JoinColumn(foreignKey = @ForeignKey(name = "exFK_Nest_Enth"))    public NestedEntity getNested() {        ...    }有没有办法做到这一点 Hibernate.initialize()
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

默认情况下,休眠最新版本遵循JPA 2.0 规范:


与以下机构的关系:


ToMany: Lazy

ToOne: Eager

但是如果您使用的是旧版本的 Hibernate,则默认情况下所有关系都带有 Lazy


在这种情况下,当您想尝试检索子关系时,请使用JOIN FETCH,例如:


Select m from MyMainEntity m JOIN FETCH m.nested;


查看完整回答
反对 回复 2021-09-03
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

您可以使用 Hibernate Criteria 查询来获取 MyMainEntity 并使用 criteria.createAlias("nested", "ns", Criteria.Subselect)。它会触发两个查询;一个用于获取 MyMainEntity ,另一个用于嵌套 MyMainEntity 查询作为子查询。如果你使用 Criteria.Join 那么它只会触发一个查询并获取 MyMainActivity 和 Nested


查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 179 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信