如何使用Hibernate FetchProfile在层次结构中加载深层子对象

10

我和一个在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)
})

我为会话启用了FetchProfile,并成功使用session.get而无错误,C和D被填充 - E仍然是懒惰且未填充的。绝望中,我尝试从C向下使用点符号表示关联。我只能找到一个深度为一的示例。
这是我知识上的强迫症式空缺需要填补!
提前感谢任何帮助。

请问您能否发布C、D和E类的注释?(除了FetchTypes之外) - Leonel Sanches da Silva
1个回答

4
您有一个包含B对象的A对象,其中包含一个C对象。默认情况下,它们是:
...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C

一个类:

@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;
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接