Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:延迟加载不会';即使使用了getter方法,也不能加载。是吗?_Java_Jpa_Proxy_Persistence_Lazy Loading - Fatal编程技术网

Java JPA:延迟加载不会';即使使用了getter方法,也不能加载。是吗?

Java JPA:延迟加载不会';即使使用了getter方法,也不能加载。是吗?,java,jpa,proxy,persistence,lazy-loading,Java,Jpa,Proxy,Persistence,Lazy Loading,你能简单地给我解释一下下面这句话的意思吗 指定或默认为延迟加载的关系 可能会或可能不会导致在 getter方法用于访问对象。对象可能是一个 代理,因此可能需要实际调用其上的方法才能导致它 犯错误。(Pro JPA 2:掌握Java持久性API,第102页) 我的问题是: 这是否意味着即使在getLazyLoadedObj()方法之后,也可能不会加载lazy_加载的_对象 如果第一个问题的答案是“是”,那么getLazyLoadedObj()方法会返回什么 我仍然不明白如果lazy\u加载的\u对

你能简单地给我解释一下下面这句话的意思吗

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

我的问题是:

  • 这是否意味着即使在getLazyLoadedObj()方法之后,也可能不会加载lazy_加载的_对象
  • 如果第一个问题的答案是“是”,那么getLazyLoadedObj()方法会返回什么
  • 我仍然不明白如果lazy\u加载的\u对象是代理,会发生什么变化。请给我解释一下
  • 提前谢谢你。

    是的

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

    3) 您可以想象,当调用
    getPerson()
    访问延迟加载的
    PersonEntity
    时,您得到的对象可能如下所示:

    public class LazyPersonEntity extends PersonEntity {
    
      private PersonEntity lazilyLoadedPerson;
    
      @Override
      public String getName() {
        if (lazilyLoadedPerson == null) {
          lazilyLoadedPerson = runQueryToLoadPerson();
        }
        return lazilyLoadedPerson.getName();
      }
    }
    
    显然,这不是生成的代码真正的样子,但从功能上讲,这是正在发生的事情。因此,当您执行
    getPerson()
    时,您得到的是
    LazyPersonEntity
    的一个实例,在您调用
    getName()
    回答1)是之前,仍然没有查询。为了理解2)和3)让我们举个例子

    假设您有一个类
    父类
    ,它有
    子类
    。您定义要延迟加载的

    class Parent {
    
      Child chil;
    
      //FetchMode = lazy
      public Child getChild() {
          return child;
      }
    
    }
    
    比方说,您已经使用hibernate会话加载了
    Parent
    实例,比如
    Parent

    现在,当您调用
    parent.getChild()时
    返回的对象可以是
    子对象的实例,也可以是代理

    什么是代理?

    代理类似于类的拦截器,在调用
    子类
    的任何方法之前调用子类的代理

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

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

    我们为什么需要代理?


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

    感谢您的响应。但我还是不明白第二个问题的答案。什么是“模型对象的子类”。它是否意味着人格的亚类。但是如果它没有任何子类呢?持久性提供程序框架会在运行时创建该子类。是的,在您执行导致其加载的操作之前,它是空的。因为如果您创建了一个Person类,它将必须用数据库中的所有数据填充,而不是延迟加载。子类允许JPA在调用getter时插入额外的代码来运行查询,这样它就可以等到该时间进行查询。这不是必需的,如果person可能为null,则不允许延迟加载它。必须保证外键不为null。如果您告诉JPA提供程序尝试延迟加载一个可为null的引用,它就会忽略您。不,我在调用getName()之前说过它为null。调用查询是getName()的一部分。很抱歉,现在是凌晨4点,我必须去睡觉了,也许会有人来解释一下。JPA中的所有实体都包含在代理类中吗。或者这是一种特殊情况?大多数情况下,延迟加载的实体将具有代理类。在紧急加载的情况下,可能不需要代理类。但是如果在调用getName()之前仍然没有查询,那么什么包含“lazlyLoadedPerson=runQueryToLoadPerson()”变量(请参见下面的示例)?是否为空?“大多数情况下,惰性加载的实体…”您的意思是,hibernate可能不会为实体创建代理?如果是这样,您能告诉我hibernate不创建代理的情况吗?(除了最终getter或最终类情况)