3

你能简单地解释一下下面这句话是什么意思吗:

当使用 getter 方法访问对象时,指定或默认为延迟加载的关系可能会或可能不会导致加载相关对象。该对象可能是一个代理,因此它可能需要在其上实际调用一个方法才能导致它出错。(Pro JPA 2:掌握 Java Persistence API,第 102 页)

我的问题是:

  1. 这是否意味着即使在 getLazyLoadedObj() 方法之后也可能不会加载lazy_loaded_object?
  2. 如果第一个问题的答案是“是”,那么 getLazyLoadedObj() 方法会返回什么?
  3. 我仍然不明白如果lazy_loaded_object 是代理会发生什么变化。请给我解释一下。

先感谢您。

4

2 回答 2

5

回答 1) 是的。为了理解 2) 和 3) 让我们举个例子

可以说你有一个类Parent,它有Child。您定义Child要延迟加载的 。

class Parent {

  Child chil;

  //FetchMode = lazy
  public Child getChild() {
      return child;
  }

}

可以说,您Parent已经使用休眠会话加载了实例,比如说parent

现在,当您调用parent.getChild();返回对象时,它可以是 Proxy 的实例,Child也可以是Proxy

什么是代理?

代理就像你的类的拦截器,一个代理在Child被调用的任何方法之前child被调用。

例如,当你调用child.getName()--> 让我们说

proxy.someProcessing()方法被调用,该方法在内部调用child.getName() 并最终返回数据。

为什么我们需要代理?

延迟加载的定义是在需要时加载。因此,就在child.getName()被代理调用之前,proxy.someProcessing()方法调用 DB 并获取CHILD(DB Table mapped to Child) 的列数据并加载child对象。

于 2013-06-28T09:25:33.100 回答
3

1) 是的

2) 模型对象的子类,其中有额外的代码来在调用 getter 时设置属性。

3) 你可以想象你在调用时得到的对象,比如说,getPerson()访问一个 Lazily LoadedPersonEntity可能看起来像这样:

public class LazyPersonEntity extends PersonEntity {

  private PersonEntity lazilyLoadedPerson;

  @Override
  public String getName() {
    if (lazilyLoadedPerson == null) {
      lazilyLoadedPerson = runQueryToLoadPerson();
    }
    return lazilyLoadedPerson.getName();
  }
}

显然,生成的代码并不是真正的样子,但从功能上讲,这就是正在发生的事情。所以当你做getPerson() 你得到的是一个实例LazyPersonEntity并且在你调用之前仍然没有查询getName()

于 2013-06-28T09:22:32.410 回答