JPA:如何避免EAGER获取的超时问题

时间:2016-03-09 16:42:40

标签: jpa fetch openjpa

我正面临着JPA的情况。

我有一个实体,说AA与自己有亲子关系。所以A可以有一个A(子)和一个A(父)的集合。如果父是null,则意味着A是该根的节点。层次结构。

我的用例是这样的,我需要获取表中的所有数据(可以是大约30k-40k行),然后根据实体之间的父子关系在树结构中组织它。

所以我决定让EAGER获取Collection字段,因此JPA本身可以获取所需树结构中的数据,并且它可以正常工作。 但在其他用例中,不需要获取A的整个数据,并且当数据太多时也会导致超时问题。 那么我该如何解决这个问题?

我计划将两个实体映射到表中,一个具有EAGER策略,而另一个具有LAZY策略。所以我会在我的用例中使用EAGER,其他用例会使用LAZY。 这会是一个干净的解决方案吗?

1 个答案:

答案 0 :(得分:0)

不,我不这么认为。我从来没有尝试过将任何原因将两个独立的实体附加到同一个表中,并且感觉就像一个有问题的想法。相反,我建议你考虑设置查询超时,这似乎是一个坏主意,因为你会得到很多你说不需要的数据,显然你的表现会很糟糕。

或者,也许是最好的解决方案,停止渴望获取它并不总是一个要求,我想你在实体A中说过。因为A本质上是树结构中的节点,所以把Fetch = EAGER总是要去获取整个树,正如你所说,它可能非常大。大到足以在某些情况下引起问题。我建议删除EAGER fetch,构建一些命名查询,并管理通过服务层获取的内容。它不是很难,过去对我来说效果很好。