假设我得到了
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()时会发生什么,你能给出完整的循环吗?
答案 0 :(得分:2)
它的工作方式与在任何环境中的工作方式相同。假设存在活动会话,Hibernate将调用数据库来检索延迟加载的集合。请注意,如果您有一个与用于加载父对象的会话不同的会话,那么您需要首先merge
父对象。
至于它是如何运作的 - byte code instrumentation。在幕后,Hibernate创建了一个代理服务器&#39;用于包装实体的对象,并根据需要从此代理进行方法调用以满足调用者请求。
非常粗略 ,会发生这样的事情:
Father (FatherProxy) -> Lazy Collection Reference -> Session -> Load Entities
答案 1 :(得分:0)
您将在日志中看到2个查询。第一个加载父亲,然后因为你正在调用getSons(),它会去获取儿子,所以你会看到第二个查询。