我正在使用JPA从数据库中获取实体。实体具有父子关系,我想获取整个层次结构。所以我获取所有根节点(没有父节点的实体),然后我递归迭代这些节点以获取整个层次结构。
所有节点都已获取,但需要大约12分钟。表中共有5500行。
我想知道这是一个好的表现还是我应该改进它?
答案 0 :(得分:0)
如果我理解正确的话,你正在加载一张完整的表格。您只是碰巧获取根并深入了解层次结构中的访问者以触发关联的初始化。这将生成许多单独的select语句来仅获取层次结构的一部分,并且它会将应用程序的延迟乘以发出的语句数。
如果是这种情况,你也可以在一个选择LEFT JOIN FETCH
中获取整个表 - 从父项到子项的OneToMany
关联。这样,您只需在数据库的一次往返中加载整个层次结构。
假设HierarchyElement
是您的实体类,HierarchyElement.children
是元素的孩子HierarchyElement.parent
的集合,是对父母的引用,以下是JPA查询
select he from HierarchyElement he where he.parent is null
一个访问者迭代元素并递归初始化HierarchyElement.children
集合将比
select he from HierarchyElement he left join fetch he.children
使用后一个查询,您的所有HierarchyElement
个HierarchyElement.children
个集合都已初始化。由于您正在加载整个表格,因此即使HierarchyElement.parent
关联标记为parent
,您也可以正确指向正确的实体LAZY
关系。这是有效的,因为当JPA提供程序为您构建实体时,所有实体都将位于第一个缓存中,JPA提供程序将知道要连接的实体。
通过上述内容,您可以轻松浏览所有已获取的元素,并仅获取父级为null的那些层次结构根。