如何让Hibernate FetchProfile加载层次结构中的深层子对象

Ant*_*ony 9 java profile hibernate fetch

我和Hibernate社区中发布的人有相同的问题:FetchProfiles.

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

...C -[FetchType.LAZY]-> D -> [FetchType.LAZY] -> E
Run Code Online (Sandbox Code Playgroud)

使用FetchProfile我热切负荷d与C,但我无法弄清楚如何急切地加载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)
})
Run Code Online (Sandbox Code Playgroud)

我为会话启用了FetchProfile并成功使用了session.get而没有错误,并且填充了C和D - E仍然是懒惰且未填充的.无奈之下,我记得从C向下尝试点关联.我只能找到深度为1的示例.

据我所知,这是一个需要填充的OCD类型差距!

在此先感谢您的帮助.

MaV*_*ldo 4

你有一个 A 对象,其中包含一个 B 对象,又包含一个 C 对象。默认情况下它们是

...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C
Run Code Online (Sandbox Code Playgroud)

一类:

@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;    
    //...
}
Run Code Online (Sandbox Code Playgroud)

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;    
    //...
}
Run Code Online (Sandbox Code Playgroud)

阿道类:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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