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.hbm.xml你还用这个配置呀,现在都是注解了
    懒加载顾名思义其实就延迟加载,需要用到的时候进行加载对象,
      Session session=HibernateSessionFactory.getSession();
      Customer cs=(Customer)session.get(Customer.class,"c001");  
    cs.class肯定是Customer 对象呀
    只有调用到orders的时候才会进行加载
    即是使用getOrders
      

  2.   

    也许是我表达不好,但你没有完全明白我的意思。懒加载的实现机理是通过session.load方法返回一个代理类,
    这个代理类对应的getOrders方法中会检查orders是否被加载了,若没有加载则先加载orders再返回orders,这就
    是为什么第2条sql语句是调用getOrders的时候才显示出来。但是如果返回的是Customer对象,在调用getOrders
    的时候如何触发对第2条语句的执行呢?