当前位置: 首页 > 面试题库 >

如何通过HQL延迟加载一对一合成

焦正德
2023-03-14
问题内容

如果实体A具有与实体B的双向一对一或零对一映射。

映射如下:

<class name="EntityA" table="TABLE_A" mutable="true" lazy="true">
    <id name="idA" type="long" column="pk_a" unsaved-value="null">
        <generator class="sequence">
            <param name="sequence">pk_a_seq</param>
        </generator>
    </id>
    <one-to-one name="propertyB" class="EntityB" property-ref="propertyA" constrained="true" outer-join="false"/>
</class>

<class name="EntityB" table="TABLE_B" mutable="true" lazy="true">
    <id name="idB" type="long" column="pk_b" unsaved-value="null">
        <generator class="sequence">
            <param name="sequence">pk_b_seq</param>
        </generator>
    </id>
    <many-to-one name="propertyA" class="EntityA" not-null="true" unique="true" lazy="proxy" column="fk_a"/>
</class>

当我对EntityA进行hql查询(或更确切地说,是命名的hql查询)时,hibernate会急切地用单独的select语句加载EntityA#propertyB。

我的问题是,如果我的hql返回1000个EntityA(所有人都有各自的EntityB),hibernate将执行n +
1个查询(第一个查询是针对EntityA返回1000个结果,而n个查询将来自EntityA# propertyB选择延迟加载)。

但是,我不需要那些EntityA#propertyB,这就是为什么我想懒加载它们的原因(无需让hibernate使用单独的sql查询)。

那可能吗?如果是的话,我该怎么做?

谢谢弗朗兹


问题答案:

我已经解决了这个问题。

我所做的就是创建将字段EntityA#propertyB转换为名称为EntityA#propertyBs的Set的方法。但是我保留了EntityA#getPropertyB()和EntityA#setPropertyB(EntityB
propertyB)访问器方法。

这些访问器方法的方法主体现在如下所示:

public EntityB getPropertyB() {
    return CollectionUtils.get(propertyBs, 0);
}

public void setPropertyBs(EntityB propertyB) {
    propertyBs= Collections.singleton(propertyB);
}

然后在我的映射中,我映射了集合EntityA#propertyBs并指定对“字段”的访问。

<set name="scheduledAdInfos" lazy="true" fetch="subselect" access="field" cascade="none" inverse="true">
    <key column="pk_a"/>
    <one-to-many class="EntityB"/>
</set>

使用此设置,您现在可以创建从拥有的POJO(EntityA)到拥有的POJO(EntityB)的惰性映射,即使TABLE_B由TABLE_B拥有也是如此。



 类似资料:
  • 本文向大家介绍Mybatis一对一延迟加载实现过程解析,包括了Mybatis一对一延迟加载实现过程解析的使用技巧和注意事项,需要的朋友参考一下 需求:用户和账户一对一关系,查询账户时实现用户的延迟加载 思路:根据id查询,需要延迟加载的一方 1、用户实体类 2、账户实体类 3、用户持久层接口 4、账户持久层接口 5、全局配置文件 6、用户映射配置文件 7、账户映射配置文件 以上就是本文的全部内容,

  • 我面临的问题是一对一的惰性加载在Hibernate中不起作用。我已经解决了,但还是不明白会发生什么。 我的代码(懒惰加载在这里不起作用,当我拉person-address也被提取): 但是:如果我在OneToOne关系中添加,那么惰性加载工作很好! 问题/恳求:请给我解释一下注释如何帮助实现延迟加载。 附注。我看过post1和post2,明白了为什么简单的OneToOne不能偷懒,但我还是不能掌握

  • 问题内容: 我遇到了 一个 问题,即 一对一的延迟加载 在hibernate状态下不起作用。我 已经解决了它 ,但仍然 无法 正确 理解 会发生什么。 我的代码( 延迟加载在这里不起作用 ,当我拉人时-地址也被获取): 但是 :如果我添加 OneToOne关系,则延迟加载 效果很好 ! 问题/完整性: 请向我解释注释如何帮助实现延迟加载。 PS 我已经阅读了post1和post2的帖子,并了解了为

  • 当执行session . create query(" from Author ")时。list();即使关系被标记为optional=false,fetch type = lazy from Author- Hibernate:选择author0_。作者ID为作者I1 0,作者0。电子邮件为email2_0_,author0_。名为name3_0_ from AUTHOR author0_ Hi

  • 我正在处理Web Spring hibernate项目,我的加载集有问题 我有一个java类实体 礼物、建议和相关设置都很懒,我不想渴望 现在我想在一个语句hibernate查询中加载礼物、建议和相关产品 对我的想法最好的建议是什么 我无法更改源代码,我想找到在加载产品时加载设置对象的方法

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l