Hibernate的session.get是不支持懒加载的,load方法支持,但是当进行如下操作的时候却和预想的大不一样,谁能解释是什么原因。
1.定义一个Customer类
public class Customer implements java.io.Serializable {
//其中的orders集合需要进行懒加载
private Set<Orders> orders=new HashSet<Orders>();
...2.在Customer.hbm.xml中进行如下配置
<set name="orders" lazy="true">
<key column="cid"/>
<one-to-many class="com.Orders"/>
</set>
3.此时若执行一下代码:
Session session=HibernateSessionFactory.getSession();
Customer cs=(Customer)session.get(Customer.class,"c001");
System.out.println("------------------");
System.out.println(cs.getOrders());
这段程序会触发两条SQL,一条是加载Customer的,一条是加载orders的,照理说这里用的get,那么应该是两条SQL一起执行,但是实际输出却是这样:
Hibernate: select customer0_.id as id1_0_, customer0_.name as name1_0_, customer0_.age as age1_0_, customer0_.sex as sex1_0_, customer0_.city as city1_0_ from simple.customer customer0_ where customer0_.id=?
------------------
Hibernate: select orders0_.cid...
也就是当执行到cs.getOrders()才加载的orders,这不就是懒加载么??
如果这是你打印出cs的class,会发现get方法并没有返回代理,返回的就是Customer类,那么又是通过什么机制触发的第二条SQL呢??
1.定义一个Customer类
public class Customer implements java.io.Serializable {
//其中的orders集合需要进行懒加载
private Set<Orders> orders=new HashSet<Orders>();
...2.在Customer.hbm.xml中进行如下配置
<set name="orders" lazy="true">
<key column="cid"/>
<one-to-many class="com.Orders"/>
</set>
3.此时若执行一下代码:
Session session=HibernateSessionFactory.getSession();
Customer cs=(Customer)session.get(Customer.class,"c001");
System.out.println("------------------");
System.out.println(cs.getOrders());
这段程序会触发两条SQL,一条是加载Customer的,一条是加载orders的,照理说这里用的get,那么应该是两条SQL一起执行,但是实际输出却是这样:
Hibernate: select customer0_.id as id1_0_, customer0_.name as name1_0_, customer0_.age as age1_0_, customer0_.sex as sex1_0_, customer0_.city as city1_0_ from simple.customer customer0_ where customer0_.id=?
------------------
Hibernate: select orders0_.cid...
也就是当执行到cs.getOrders()才加载的orders,这不就是懒加载么??
如果这是你打印出cs的class,会发现get方法并没有返回代理,返回的就是Customer类,那么又是通过什么机制触发的第二条SQL呢??
懒加载顾名思义其实就延迟加载,需要用到的时候进行加载对象,
Session session=HibernateSessionFactory.getSession();
Customer cs=(Customer)session.get(Customer.class,"c001");
cs.class肯定是Customer 对象呀
只有调用到orders的时候才会进行加载
即是使用getOrders
这个代理类对应的getOrders方法中会检查orders是否被加载了,若没有加载则先加载orders再返回orders,这就
是为什么第2条sql语句是调用getOrders的时候才显示出来。但是如果返回的是Customer对象,在调用getOrders
的时候如何触发对第2条语句的执行呢?