gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:52 26 4
gpt4 key购买 nike

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

这是我知识中的一个强制症类型的空白,需要填补!

在此先感谢您的帮助。

最佳答案

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

...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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com