hibernate中的延迟加载(lazyload)分属性的延迟加载和关系的延迟加载
属性的延迟加载:
当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询。否则不会访问数据库。
package com.how2java.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.how2java.pojo.Product;
public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
//核心代码:在打印log1之前,是不会打印出sql语句的,只有在访问属性“getName()"的时候,才会访问数据库
Product p = (Product)s.load(Product.class, 1);
System.out.println("log1");
System.out.println(p.getName());
System.out.println("log2");
s.getTransaction().commit();
s.close();
sf.close();
}
}
延迟加载又叫lazyload,在one-many many-many的时候都可以使用关系的延迟加载
修改配置文件 Category.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.how2java.pojo">
<class name="Category" table="category_">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
<!-- 这里将lazy="false"改为true,表示通过Category获取产品是延迟加载的-->
<set name="products" lazy="true">
<key column="cid" not-null="false" />
<one-to-many class="Product" />
</set>
</class>
</hibernate-mapping>
测试代码:
package com.how2java.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.how2java.pojo.Category;
public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
Category c = (Category) s.get(Category.class, 1);//只会查询Category表的信息,不会查询product_表
System.out.println("log1");
System.out.println(c.getProducts());//通过category取products的时候,才会进行对product_表的查询
System.out.println("log1");
s.getTransaction().commit();
s.close();
sf.close();
}
}
为什么要使用关系延迟?
比如有的页面只需要显示分类信息,这个时候倘若没有开启延迟加载,那么就会把分类下的产品也查询出来了,增加了不必要的开销。