【问题标题】:How to get Hibernate FetchProfile to load deep child objects in the hierarchy如何让 Hibernate FetchProfile 加载层次结构中的深层子对象
【发布时间】:2011-07-22 20:03:37
【问题描述】:

我和 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 向下的关联使用点符号。我只能找到深度为 1 的示例。

这是我所知道的强迫症类型的空白,需要填补!

提前感谢您的帮助。

【问题讨论】:

  • 你能把C、D和E类的注释贴出来吗? (除了 FetchTypes)

标签: java hibernate profile fetch


【解决方案1】:

你有一个 A obj 包含一个 B obj,包含一个 C obj。默认情况下它们是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多