笔记:
<class name="Student" table="student" >
<id name="studentNO" type="int">
<generator class="native"></generator>
</id>
<property name="studentName" type="string"/>
<many-to-one name="classes" column="classNO" class="Classes" fetch="join" lazy="false"></many-to-one>
</class>
当用load方法加载Student时,会延时加载
当不设fetch=join用lazy=true时:
对于many-to-one,one-to-one,集合如component,set,map,array,list这些本身默认lazy=true的属性,不管是load还是get,表现出来的都是使用classes时才加载,看上去get在这里也是延时加载了,可见延不延时加载在此时只是针对当前对象的普通属性。但是当lazy=false时,这些属性,不管是load还是get都是都是同时发出两条sql,尽管load方法是在使用当前对象时才发出sql,而get是在一执行时就发出2条sql。
当设fetch=join时
查询student时,会同时查出classes,而且是通过一条连接查询实现,这个时候集合属性里面的lazy就没有作用了。
对于load会在使用student或classes时,发出sql,对于get会在执行进就发出sql
-
Join fetching - Hibernate retrieves the associated instance or collection in the same SELECT , using an OUTER JOIN .用外连接检索相关的实例或集合,通过一条select语句(实了下,发现是左外连接)
-
Select fetching - a second SELECT is used to retrieve the associated entity or collection. Unless you explicitly disable lazy fetching by specifying lazy="false" , this second select will only be executed when you actually access the association.通过第二条select语句检索相关的实体或集合,但是前提lazy=false,并且只有在访问相关数据时才会发出第二条sql