我和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的示例。
据我所知,这是一个需要填补的OCD类型差距!
提前感谢您的帮助。
答案 0 :(得分:4)
你有一个包含B obj的A obj,包含一个C obj。默认情况下它们是
...A -[FetchType.LAZY]-> B -> [FetchType.LAZY] -> C
A class:
@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的B填充C.这是一个非常基本的解决方案,你可以建立一个Dao方法,将获取配置文件列表作为参数。