Hibernate 的延迟加载

原创 2018年04月15日 15:07:09

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框架-----属性延迟加载和关系延迟加载(七)

属性的延迟: 我们之前在获取一条数据的时候采用的都是Session的get方法,这种方式不是延迟加载,也就是调用这个方法就会立刻访问数据库查出此对象的数据,当我们采用Session的load方法时,...
  • sinat_15274667
  • sinat_15274667
  • 2016-12-27 00:00:06
  • 1442

Hibernate的延迟加载

hibernate中,延迟加载大致可以分为两类,一类是延迟属性加载,另一类是延迟关联实体加载。 普通属性:分两种情况,一种是集合属性,一种是非集合属性(如String、Integer......) 集...
  • r91987
  • r91987
  • 2015-01-02 20:13:51
  • 4889

深入理解Hibernate的延迟加载机制

 延迟加载的定义  延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟...
  • jojoy_828
  • jojoy_828
  • 2007-12-01 23:45:00
  • 2135

hibernate面试题 --- Hibernate是如何延迟加载的

Hibernate是如何延迟加载的 (1)首先介绍一下延迟加载的几种情况:        当调用Session上的load()方法加载实体时,就会采用延迟加载        当Session加载...
  • hanxiaoshuang321123
  • hanxiaoshuang321123
  • 2011-12-24 15:54:22
  • 2628

解决Hibernate延迟加载出现的问题

因为一个事务sql语句一个session打开关闭的过程。所以业务处理的一个事务需要两个sql语句才能解决时,一个sql语句执行后session关闭,第二个sql语句执行时显示no session。所以...
  • dragon4s
  • dragon4s
  • 2011-07-20 16:59:20
  • 4777

hibernate annotation方式实现属性级延迟加载

1.在POJO文件需要延迟加载的属性上加“ @Basic(fetch = FetchType.LAZY) ” 2、借助类增强器对二进制Class文件进行强化处理(buildtime byteco...
  • wangshfa
  • wangshfa
  • 2014-05-27 21:13:00
  • 1844

Hibernate缓存及延迟加载

“缓存”在提高系统性能方面发挥着重要的
  • lemonpan19
  • lemonpan19
  • 2014-11-03 09:58:49
  • 847

hibernate实体配置关系映射&延迟加载

概述        一个实体里面是可以配置多个映射关系的,也就是说同一个实体里面既能够配置@OneToMany同时也可以存在@ManyToOne(这条是废话,直接略过即可);        映射关系配...
  • yangbo2921946188
  • yangbo2921946188
  • 2016-03-29 11:04:14
  • 753

hibernate 使用延迟加载产生的问题以及对应的解决方法

Hibernate延时加载,其实这个异常写的非常之清楚,就是会话关闭,无法对Hibernate实体进行操作。造成这样的情况有很多,什么书写错误啊,逻辑错误啊。 但就此说一下关于lazy机制: ...
  • h183288132
  • h183288132
  • 2015-05-30 17:35:27
  • 2156

hibernate的延迟加载及其与session关闭的矛盾

延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。     那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢?     其实很简单,它使用了代理机...
  • WarcraftJimmy
  • WarcraftJimmy
  • 2012-05-04 17:16:14
  • 7118
收藏助手
不良信息举报
您举报文章:Hibernate 的延迟加载
举报原因:
原因补充:

(最多只允许输入30个字)