我有一个与Hibernate社区中发布的人相同的问题:FetchProfiles

出于性能原因,我在数据模型中具有如下关系:

...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> E

使用FetchProfile,我可以用C急切地加载D,但是我不知道如何急切地加载E。我知道我可以通过内部联接成功使用NamedQuery,但这确实使我感到困惑,无法解决该问题。使用FetchProfile。尝试FetchProfile的示例(在时间的迷雾中丢失了其他所有内容):
@FetchProfile(name = "cwithDAndE", fetchOverrides = {
        @FetchProfile.FetchOverride(entity = C.class, association = "dByCId", mode = FetchMode.JOIN),
        @FetchProfile.FetchOverride(entity = D.class, association = "eByDId", mode = FetchMode.JOIN)
})

我为 session 启用了FetchProfile并成功使用了session.get且没有错误,并且填充了C和D-E仍然是懒惰的,并且没有填充。绝望的是,我记得尝试从C向下尝试点表示法来建立关联。我只能找到深度为一的示例。

在我的知识中,这是OCD类型的缺口,需要补充!

在此先感谢您的帮助。

最佳答案

您有一个包含B obj和A obj的A obj。默认情况下,它们是

...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C

A类:
@FetchProfiles({
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "b", entity = A.class, mode = FetchMode.JOIN) }, name = "a-with-b")
    })
@Entity
@Table(name="EDITOR_IDENTITIES")
public class A {
    private B b;
    //...
}

B类:
@FetchProfiles({
    @FetchProfile(fetchOverrides = { @FetchOverride(association = "c", entity = B.class, mode = FetchMode.JOIN) }, name = "b-with-c")
    })
@Entity
@Table(name="EDITOR_IDENTITIES")
public class B {
    private C c;
    //...
}

ADao类:
@Repository(value="aDaoImpl")
@Transactional
public class ADaoImpl {

    @Override
    public A loadByPrimaryKey(long id)
    {
        Session session = sessionFactory.getCurrentSession();
        session.enableFetchProfile("a-with-b");
        session.enableFetchProfile("b-with-c");
        Criteria criteria = session.createCriteria(A.class);
        criteria.add(Restrictions.eq("id", id));
        A a = (A) criteria.uniqueResult();
        if(identity != null)
            return identity;
        else
            return null;
    }
}

您将得到A填充,B填充和C填充。这是一个非常基本的解决方案,您可以使用获取配置文件列表作为参数来构建Dao方法。

关于java - 如何获取Hibernate FetchProfile来加载层次结构中的深层子对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5431492/

10-11 07:12