如果有一个实体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查询),休眠急切地加载EntityA#propertyB一个单独的select语句。

我的那个问题是,如果我的HQL收益1000 EntityA的(与所有有他们自己各自EntityB的),hibernate会做N + 1个查询(第一查询将是EntityA返回1000个结果,而N查询将从现身所述EntityA#propertyB选择迟缓装载)。

不过,我不需要这些EntityA#propertyB的,这就是为什么我要延迟加载他们,而不是(无需休眠使用一个单独的SQL查询)。

时,可能吗?如果是这样,我怎么做呢?

谢谢, 弗朗兹

有帮助吗?

解决方案

我已修正这个问题。

我所做的就是创建转场EntityA#propertyB为一组名为EntityA#propertyBs什么。但我保留了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_A由表-B拥有。

其他提示

简短的回答:不,你不能做到这一点,至少在没有改变数据库的映射。你基本上要扭转一个一对一的映射和外键关系在您希望的方式工作。


更长的答案: Hibernate可以延迟加载的关联。它这样做的方式是通过注入,其保持所引用对象的ID的代理对象。

在你的情况,映射是这样的外键列在表-B,也就是说,当你使用多到一的映射。所以,如果你加载一个B,休眠发现在fk_a列FK参考,并可以创建包含此值的代理。当代理被访问相应的实体被加载。

如果选自表A中的记录什么? Hibenate将创建一个A的对象,但要能填补propertyB,就必须寻找到表-B,找到相应的行与fk_a = a.id。有没有其他办法来让Hibernate找出记录在延迟加载时间来加载。

事实上,这将是对Hibernate的改进,因为它也应该能够做到的,而延迟加载等独特的密钥加载,但目前实现不允许这一点,也许你可以提出问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top