hibernate - 当集合是惰性时调用father.getS sons()时会发生什么

时间:2013-02-21 19:18:12

标签: hibernate java-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=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()时会发生什么,你能给出完整的循环吗?

2 个答案:

答案 0 :(得分:2)

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

至于它是如何运作的 - byte code instrumentation。在幕后,Hibernate创建了一个代理服务器&#39;用于包装实体的对象,并根据需要从此代理进行方法调用以满足调用者请求。

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

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

答案 1 :(得分:0)

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