1延迟加载就是为了避免一些无谓的开销而提出来的。所谓的延迟加载就是当真正需要数据的时候才执行数据加载操作,hibernate提供了三种加载方式:实体,集合,hibernate3提出了属性加载
A 实体,设置类映射文件----lazy="true"
---------------------------------------------------------------------
<class name="com.fly.entity.User" table="user"
catalog="test"
lazy="true">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="address" type="java.lang.String">
<column name="address" length="50" not-null="true" />
</property>
</class>
---------------------------------------------------------------------
java code:
--------------------------
Session session = HibernateSessionFactory.getSession();
User user = (User) session.load(User.class, 1); <1>
System.out.println(user.getName()); <2>
System.out.println("end....");
-------------------------
当程序执行到代码<1>段的时候并不会执行sql语句,而是执行到代码2的时候才执行sql语句,在hibernate用CGLIb来动态构造一个目标对象的代理对象,代理类中包含实体类的所有属性和方法,所以属性均赋值为null,当执行到user.getName()的时候,这时通过CGLIB赋予的回调机制,实际上调CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target 属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。