Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
hibernate—当集合处于惰性状态时调用父.getSons()时会发生什么_Hibernate_Jakarta Ee - Fatal编程技术网

hibernate—当集合处于惰性状态时调用父.getSons()时会发生什么

hibernate—当集合处于惰性状态时调用父.getSons()时会发生什么,hibernate,jakarta-ee,Hibernate,Jakarta Ee,假设我有 class Father{ private Integer fatherId; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="FATHERID", nullable=false) public Integer getFatherId() { return fatherId; } Set<Son> sons; @OneToMany(fetch=FetchTyp

假设我有

 class Father{

private Integer fatherId;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="FATHERID", nullable=false)
public Integer getFatherId() {
    return fatherId;
}    


Set<Son> sons;

@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name="FATHERID")
public Set<Son> getSons() {
    return airlineFlights;
}
}
现在假设我得到了这个代码:

 Father f = session.load(Father.class, 1);
 f.getSons();
f是一个简单的POJO,子集合是懒惰的,那么这里会发生什么呢? 我们在简单的JVM中调用simple get,hibernate在那里是如何工作的

编辑
调用getSons()时会发生什么?您能给出完整的循环吗?

您将在日志中看到两个查询。第一个函数加载父函数,然后由于您正在调用getSons(),它将去获取子函数,因此您将看到第二个查询。

它的工作原理与在任何环境中的工作原理相同。假设存在活动会话,Hibernate将调用数据库检索延迟加载的集合。请注意,如果您的活动会话与用于加载父对象的会话不同,则需要先合并父对象

至于它是如何工作的-。在幕后,Hibernate创建一个“代理”对象来包装实体,并根据需要从该代理进行方法调用以满足调用方请求

非常粗略地说,类似的情况会发生:

Father (FatherProxy) -> Lazy Collection Reference -> Session -> Load Entities

当调用getSons()时会发生什么?你能给出完整的循环吗?不能给出完整的循环,它相当复杂。如果你有一篇文章或某种解释,请与我分享,我想详细了解这一点。我在回答中链接了Hibernate手册。您可以将此作为起点。请注意,仅调用
getSons()
不会触发查询。只有当您实际需要通过诸如
get()
iterator()
等访问单个项时,才会触发该命令。还要注意,字节码指令插入不适用于集合属性。可能重复的
getSons()
调用本身不会触发查询。@BalusC-Bauke-请告诉我,或者你是说它只是加载了包装器,他们实际上必须对它做一些事情,比如getSons().get(0),然后才真正启动查询?@BalusC噢,lol,请阅读上面关于已接受答案的评论。
Father (FatherProxy) -> Lazy Collection Reference -> Session -> Load Entities