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

标签 java jpa proxy persistence lazy-loading

你能简单地解释一下下面这个短语的意思吗:

A relationship that is specified or defaulted to be lazily loaded might or might not cause the related object to be loaded when the getter method is used to access the object. The object might be a proxy, so it might take actually invoking a method on it to cause it to be faulted in. (Pro JPA 2: Mastering the Java Persistence API, page 102)

我的问题是:

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

提前谢谢你。

最佳答案

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

假设您有一个类 Parent它有 Child .您定义 Child延迟加载。

class Parent {

  Child chil;

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

}

比方说,你已经加载了Parent实例已经在使用 hibernate session ,比如 parent

现在当您调用 parent.getChild(); 时返回对象可以是 Child 的一个实例或者它可以是一个代理

什么是代理?

代理就像您类(class)的拦截器Child 的代理在 child 的任何方法之前被调用被调用..

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

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

为什么我们需要代理?

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

关于java - JPA:即使使用了 getter 方法,延迟加载也不会加载。希望如此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361216/

相关文章:

java - jpa一对多插入重复键插入

networking - 如何告诉 playframework 使用我的公司代理?

multithreading - Azure 函数的多个输入

java - postgresql hibernate 插入时出现异常

java - 如何找到字符串中单词的精确匹配

java - Rectangle2D.contains() 无法正确检测边界中的坐标

java - Lucene 2.9 TokenStream API 是否比旧版本更快?

java - JPA持久化继承

java - 在 spring 应用程序中注入(inject) 2(不久的将来 3)个不同的 entityManagerFactory(或 entityManager)

c# - 使用 WebDav 通过代理上传到 SharePoint 失败并显示 HTTP 405