例如,我有一个具有以下实体和关系结构的DB:
一个人有很多技能,技能有很多行动
在.hbm.xml中,我为person > skills,skills > actions分配了一对多关系。
在查询时,我希望能够控制我查询的人,以便急切地加载仅有的技能。目前,我似乎被困在什么都不想加载的地方,并生成大量的查询来获取一个人的技能,或者生成(n*n+1)数量的查询,因为它迫切地加载整个Person > Skills > Actions集合层次结构。
我如何限制它,以便我可以控制何时加载第三个深度表?对于上下文,我可以始终接受Person > Skills集合的初始化,理想情况下可以将其作为连接,以防止n+1性能瓶颈。
发布于 2012-05-05 11:21:43
事实证明,这在运行时非常容易控制。
在我的.hbm.xml中,我继续将我的关联集声明为lazy (甚至是额外的lazy!)。
在HQL查询中,我的查询如下:
Select distinct p from Person
left join fetch p.skills
fetch关键字强制对该特定联接进行紧急加载。
发布于 2012-03-30 23:06:56
我使用以下实践:
我尽量避免对象上的子集合,特别是如果一个子集合可能有很多条目的话。如果我需要获取孩子,我会使用查询来获取它们。
如果我确实有子集合,我总是将集合设置为延迟加载。
对于“查询”,使用Criteria API,我有一个创建查询、执行查询并返回结果的类。作为构建查询的一部分,我使用root.fetch(Person_.skills); where root is javax.persistence.criteria.Root<Person>来急切地加载我想要的集合。
发布于 2012-04-01 05:03:39
这有点离题,但您可以考虑使用图形数据库的一些实现来维护这种复杂级别的数据,而不是RDBMS和Hiberante。请参阅图形数据库neo4j,它允许创建节点(在本例中是人员、技能)以及它们之间的关系(扩展、知道)。因此,您将能够轻松地遍历任何深度级别的数据。
https://stackoverflow.com/questions/9943811
复制相似问题