我有一个具有以下实体和关系结构的数据库:
[人]有很多[技能],[技能]有很多[行动]
在.hbm.xml中,我为person指定了一对多的关系>技能,技能>动作。
在查询中,我希望能够控制何时查询Person,急切加载技能。目前,我似乎陷入困境,我渴望加载NOTHING,并生成n + 1数量的查询以获得Person's Skills,或者生成(n * n + 1)个查询量,因为它急切地加载整个人>技能>动作集合层次结构。
我如何限制它以便我可以控制何时执行并且不想加载第三个深度表?对于上下文,我可以忍受总是有人>初始化技能集合,理想情况是作为JOIN来防止n + 1性能瓶颈。
答案 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
关键字会强制加载该特定联接。