Java JPA:延迟加载不会';即使使用了getter方法,也不能加载。是吗?
你能简单地给我解释一下下面这句话的意思吗 指定或默认为延迟加载的关系 可能会或可能不会导致在 getter方法用于访问对象。对象可能是一个 代理,因此可能需要实际调用其上的方法才能导致它 犯错误。(Pro JPA 2:掌握Java持久性API,第102页) 我的问题是: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对
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或最终类情况)