Hibernate - 将热切的加载集合限制在一个表深度

时间:2012-03-30 13:20:04

标签: java spring hibernate3

我有一个具有以下实体和关系结构的数据库:

[人]有很多[技能],[技能]有很多[行动]

在.hbm.xml中,我为person指定了一对多的关系>技能,技能>动作。

在查询中,我希望能够控制何时查询Person,急切加载技能。目前,我似乎陷入困境,我渴望加载NOTHING,并生成n + 1数量的查询以获得Person's Skills,或者生成(n * n + 1)个查询量,因为它急切地加载整个人>技能>动作集合层次结构。

我如何限制它以便我可以控制何时执行并且不想加载第三个深度表?对于上下文,我可以忍受总是有人>初始化技能集合,理想情况是作为JOIN来防止n + 1性能瓶颈。

3 个答案:

答案 0 :(得分:0)

我使用以下练习:

我尽量避免对象上的子集合,特别是如果子集合可能有很多条目。如果我需要孩子,我会使用查询来获取它们。

如果我有子集合,我总是将集合设置为延迟加载。

对于'查询',使用Criteria API,我有一个创建查询的类,执行它并返回结果。作为构建查询的一部分,我使用root.fetch(Person_.skills);,其中root是javax.persistence.criteria.Root<Person>,以便急切加载我想要的集合。

答案 1 :(得分:0)

这有点偏离主题,但您可能会考虑使用Graph Database的某些实现来维护这种复杂程度的数据,而不是RDBMS和Hiberante。请参阅图形数据库neo4j,它允许创建节点(在您的情况下是人员,技能)和它们之间的关系(扩展,知道)。因此,您将能够轻松遍历任何级别的数据。

答案 2 :(得分:0)

事实证明,这在运行时非常容易控制。

在我的.hbm.xml中,我继续声明我的关联设置为懒惰,(甚至更加懒惰!)。

在HQL查询中,我查询如下:

Select distinct p from Person

left join fetch p.skills

fetch关键字会强制加载该特定联接。