JPA:即使使用了getter方法,也不会加载延迟加载。希望如此?

VB_*_*VB_ 3 java proxy persistence jpa lazy-loading

您能简单解释一下下面这句话的意思吗?

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

我的问题是:

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

先感谢您。

san*_*hat 5

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

假设您有一堂课Parent,而且有Child。您定义Child要延迟加载的。

class Parent {

  Child chil;

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

}
Run Code Online (Sandbox Code Playgroud)

假设您Parent已经使用休眠会话加载了实例,例如parent

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

什么是代理?

代理就像您的类的拦截器一样,Child在调用任何获取方法之前,都要获取代理child

例如,当您调用child.getName()->时说

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

为什么我们需要代理?

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