0

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

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

在 .hbm.xml 中,我为人员 > 技能、技能 > 动作分配了一对多的关系。

在查询中,我希望能够控制何时查询 Person,只急切加载技能。目前,我似乎被困在我急于加载任何内容并生成 n+1 数量的查询以获取人员技能的位置,或者正在生成 (n*n+1) 数量的查询,因为它急切地加载了整个人员 > 技能 > 操作集合层次结构。

我将如何限制它以便我可以控制何时加载和不想加载第三个深度表?对于上下文,我可以忍受始终初始化 Person > Skills 集合,理想情况下作为 JOIN 来防止 n+1 性能瓶颈。

4

3 回答 3

0

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

在我的 .hbm.xml 中,我继续声明我的关联集是懒惰的(甚至更懒惰!)。

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

Select distinct p from Person

left join fetch p.skills

fetch关键字强制急切加载该特定连接。

于 2012-05-05T03:21:43.467 回答
0

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

于 2012-03-31T21:03:39.067 回答
0

我使用以下做法:

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

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

对于“查询”,使用 Criteria API,我有一个创建查询、执行查询并返回结果的类。作为构建查询的一部分,我使用root.fetch(Person_.skills);where root isjavax.persistence.criteria.Root<Person>急切地加载我想要的集合。

于 2012-03-30T15:06:55.507 回答