0

假设我得到了

 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;
}
}

和儿子

   class Son{


Integer sonId
@Id
@GeneratedValue(generator="identity")
@GenericGenerator(name="identity", strategy="identity")
@Column(name="SONID", nullable=false)
public Integer getSonId() {
    return sonId;
}

 Father father;

     @ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="FATHERID", nullable=false)
public Father getFather() {
    return father;
}

}

现在让我们假设我得到了这个代码:

 Father f = session.load(Father.class, 1);
 f.getSons();

f 是一个简单的 POJO 并且儿子的集合是惰性的,那么这里会发生什么?gonig 如何进入数据库并查询这些儿子,我们在简单的 JVM 中调用简单的 get,hibernate 如何在那里工作?

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

4

2 回答 2

2

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

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

非常粗略地,会发生这样的事情:

Father (FatherProxy) -> Lazy Collection Reference -> Session -> Load Entities
于 2013-02-21T19:25:36.140 回答
0

您将在日志中看到 2 个查询。第一个加载父亲,然后因为您正在调用 getSons(),它将去获取儿子,因此您将看到第二个查询。

于 2013-02-21T19:25:12.610 回答