我有一条很长的链子,所有的东西都会懒洋洋地装上。我们使用JPA(在取模式上运气不好)
在一些情况下,我们不必加载完整的对象图,在这些情况下,性能是好的。但在其他情况下,我们可能需要加载一个完整的对象图,如下所示。
类下面的只用于表示
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 objectsThirdObject.java
@Lazy
private Set<FourthObject> // may load 10 - 100 recordsFourthObject.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连接所有相关的子元素,并将实体对象作为一个选项返回,但我想知道所有的努力是否都是好的。
注意:用户可能不需要对象图中返回的所有信息,但是,为了显示目的,他只需要几个属性(但他需要所有对象)。
发布于 2014-01-31 18:05:47
我考虑过使用自定义JPQL/本机SQL连接所有相关的子元素,并将实体对象作为一个选项返回,但我想知道所有的努力是否都是好的。
我觉得这对你来说是个不错的选择。您必须在数据库中以某种方式总结这些信息,并尽量减少应用程序中的对象创建。将所有这些对象放入主内存中只是为了执行一些计算,这是个坏主意。
此外,考虑预计算结果,如果它们是昂贵的去做,以改善时间响应。例如,如果计算某些总数很昂贵,则在DB中的其他地方保留一个总数,并在每个插入/删除项上增加/减少总数。
https://stackoverflow.com/questions/21486177
复制相似问题