Hibernate 的延迟加载

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();
	}
}

为什么要使用关系延迟?

比如有的页面只需要显示分类信息,这个时候倘若没有开启延迟加载,那么就会把分类下的产品也查询出来了,增加了不必要的开销。

阅读更多
文章标签: Hibernate
个人分类: Hibernate
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭