使用延迟加载的最佳方法

时间:2014-01-31 17:20:49

标签: java hibernate jpa

我有一个很长的对象链,所有这些对象都会被懒散地加载。我们使用JPA(在fetchmodes上运气不好)

在少数情况下,我们不必加载完整的对象图,在这些情况下性能很好。但在其他一些情况下,我们可能必须加载一个完整的对象Graph,如下所示。

以下课程仅供参考

FirstObject.java

@Lazy
private Set<SecondObject>

SecondObject.java    
@Lazy
private Set<ThirdObject> // may load 20-30 objects
@Lazy
private Set<FourthObject> // may load 20-30 objects

ThirdObject.java
@Lazy
private Set<FourthObject> // may load 10 - 100 records

FourthObject.java
@Lazy
private Set<FifthObject> // may load 10-100 records




(列表继续)

边缘情况

如果你看到,每个孩子都会载入几个孩子并且无法避免。想象一下,用户现在正在尝试加载Firstobject.java,他需要完整的对象图,直到FifthObject.java图。

firstObject = session.get(FirstObject.class, 10);

//因为所有的孩子都很懒,所以他会尝试像下面那样初始化它们。

firstObject.getSecondObject().size() // size() for load all the lazy children

//现在每个孩子都是一个集合,他们很懒,所以他必须做以下

for(SecondObject sec: firstObject.getSecondObject()){
    sec.getThirdObject().size();
   //because third object needs fourth object we loop third and get all ffourth
}

以上所有代码运行大约需要7-10秒,如果孩子更多,可能会更多。

问题是,在这种情况下如何加载对象?用户交互非常不稳定,我们可能需要也可能不需要完整的图表。

我已经考虑过使用自定义JPQL /本地SQL连接所有相关的子节点并返回Entity对象作为一个选项,但想知道是否所有的努力都是好的。

注意:用户可能不需要在对象图中返回的所有信息,但是,他只需要几个属性用于显示目的(但他需要所有对象)。

1 个答案:

答案 0 :(得分:1)

  

我已经考虑过使用自定义JPQL /本地SQL连接所有相关的子节点并返回Entity对象作为一个选项,但想知道是否所有的努力都是好的。

我认为这对你来说是个不错的选择。您必须在数据库中以某种方式汇总此信息,并最大限度地减少应用程序中的对象创建。将所有这些对象放入主存储器只是为了执行一些计算是一个坏主意。

另外,如果结果很难完成,请考虑预先计算结果,以改善时间响应。例如,如果计算某些总计的成本很高,请在DB中的其他位置保留一个总计,并在每个插入/删除的项目上增加/减少它。

相关问题