hibernate加载策略之懒加载

30 篇文章 0 订阅
30 篇文章 0 订阅

hibernate的加载策略有两种:

1)即时加载--get加载数据

使用get获取数据,会立即查询,先到缓存中查找,找不到再到数据库中查找。

2)延迟加载(懒加载lazy)--load加载

不会立即查找,当需要的时候才会查找。

容易造成LazyInitializationException异常。如果出现这个异常,大部分是因为session被关闭了,还要从session中获取数据造成的。

但是懒加载也是有优势的,那就是效率高。因为我们查数据时不一定要把所有数据都查询出来。

注:load支持延迟加载,get不支持延迟加载。如果没有设置延迟加载,那么load也会立即加载对象。

案例:

项目结构:

book实体类:

package com.liuyongqi.MavenHibernateDemo3.entity;
/**
 * 书本实体类
 * @author Administrator
 * @data   2018年8月2日
 * @time   下午7:43:54
 */

import java.util.Date;

public class Book {
	
	private Integer book_id ;
	private String book_name ;
	private Float book_price ;
	private String book_auther ;
	private Date book_date ;
	private Book_Category book_category;
	
	public Book() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Book(String book_name, Float book_price, String book_auther, Date book_date) {
		super();
		this.book_name = book_name;
		this.book_price = book_price;
		this.book_auther = book_auther;
		this.book_date = book_date;
	}
	public Book(Integer book_id, String book_name, Float book_price, String book_auther, Date book_date,
			Book_Category book_category) {
		super();
		this.book_id = book_id;
		this.book_name = book_name;
		this.book_price = book_price;
		this.book_auther = book_auther;
		this.book_date = book_date;
		this.book_category = book_category;
	}
	public Integer getBook_id() {
		return book_id;
	}
	public void setBook_id(Integer book_id) {
		this.book_id = book_id;
	}
	public String getBook_name() {
		return book_name;
	}
	public void setBook_name(String book_name) {
		this.book_name = book_name;
	}
	public Float getBook_price() {
		return book_price;
	}
	public void setBook_price(Float book_price) {
		this.book_price = book_price;
	}
	public String getBook_auther() {
		return book_auther;
	}
	public void setBook_auther(String book_auther) {
		this.book_auther = book_auther;
	}
	public Date getBook_date() {
		return book_date;
	}
	public void setBook_date(Date book_date) {
		this.book_date = book_date;
	}
	public Book_Category getBook_category() {
		return book_category;
	}
	public void setBook_category(Book_Category book_category) {
		this.book_category = book_category;
	}
	@Override
	public String toString() {
		return "Book [book_id=" + book_id + ", book_name=" + book_name + ", book_price=" + book_price + ", book_auther="
				+ book_auther + ", book_date=" + book_date + ", book_category=" + book_category + "]";
	}	
	
	

}

Book_Category实体类:

package com.liuyongqi.MavenHibernateDemo3.entity;

import java.util.HashSet;
import java.util.Set;

/**
 * 书本类别实体类
 * @author Administrator
 * @data   2018年8月2日
 * @time   下午7:46:08
 */
public class Book_Category {
	private Integer book_category_id;
	private String book_category_name;
	private Set<Book> books=new HashSet<Book>();
	
	public Book_Category() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Book_Category(String book_category_name) {
		super();
		this.book_category_name = book_category_name;
	}
	public Book_Category(Integer book_category_id, String book_category_name) {
		super();
		this.book_category_id = book_category_id;
		this.book_category_name = book_category_name;
	}
	public Book_Category(Integer book_category_id, String book_category_name, Set<Book> books) {
		super();
		this.book_category_id = book_category_id;
		this.book_category_name = book_category_name;
		this.books = books;
	}
	public Integer getBook_category_id() {
		return book_category_id;
	}
	public void setBook_category_id(Integer book_category_id) {
		this.book_category_id = book_category_id;
	}
	public String getBook_category_name() {
		return book_category_name;
	}
	public void setBook_category_name(String book_category_name) {
		this.book_category_name = book_category_name;
	}
	public Set<Book> getBooks() {
		return books;
	}
	public void setBooks(Set<Book> books) {
		this.books = books;
	}
	@Override
	public String toString() {
		return "Book_Category [book_category_id=" + book_category_id + ", book_category_name=" + book_category_name
				+ ", books=" + books + "]";
	}
	/*@Override
	public String toString() {
		return "Book_Category [book_category_id=" + book_category_id + ", book_category_name=" + book_category_name
				+ "]";
	}*/
	
	

}

Book.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-8-4 9:31:36 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.liuyongqi.MavenHibernateDemo3.entity.Book" table="book">
        <id name="book_id" type="java.lang.Integer">
            <column name="book_id" />
            <generator class="native" />
        </id>
        <property name="book_name" type="java.lang.String">
            <column name="book_name" />
        </property>
        <property name="book_price" type="java.lang.Float">
            <column name="book_price" />
        </property>
        <property name="book_auther" type="java.lang.String">
            <column name="book_auther" />
        </property>
        <property name="book_date" type="java.util.Date">
            <column name="book_date" />
        </property>
        <many-to-one name="book_category" class="com.liuyongqi.MavenHibernateDemo3.entity.Book_Category" fetch="join" cascade="all">
            <column name="book_category_id" />
        </many-to-one>
    </class>
</hibernate-mapping>

Book_Category.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-8-4 9:31:36 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.liuyongqi.MavenHibernateDemo3.entity.Book_Category" table="book_category">
        <id name="book_category_id" type="java.lang.Integer" >
            <column name="book_category_id" />
            <generator class="native" />
        </id>
        <property name="book_category_name" type="java.lang.String">
            <column name="book_category_name" />
        </property>
        <set name="books" table="book" inverse="false" lazy="true">
            <key>
                <column name="book_category_id" />
            </key>
            <one-to-many class="com.liuyongqi.MavenHibernateDemo3.entity.Book" />
        </set>
    </class>
</hibernate-mapping>

SessionFactoryUtil工具类:

package com.liuyongqi.MavenHibernateDemo3.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * 提供了开启和关闭session的方法
 * @author Administrator
 * @data   2018年8月1日
 * @time   下午3:32:56
 */
public class SessionFactoryUtil {
	//ThreadLocal为每个线程提供一个单独的存储空间
	private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
	
	//私有化静态变量,静态变量只实例化一次
	private static SessionFactory sessionFactory;
	//实例化一次sessionFactory
	static {
		Configuration configure = new Configuration().configure();
		sessionFactory=configure.buildSessionFactory();
	}
	//私有化构造方法
	private SessionFactoryUtil() {
		
	}
	//打开session的方法
	public static Session openSession() {
		//从ThreadLocal中拿取一个session
		Session session = threadLocal.get();
		if(null==session) {
			//sessionFactory打开一个session
			session=sessionFactory.openSession();
			//把session又放入ThreadLocal中
			threadLocal.set(session);
		}
		return session;
	}
	
	//关闭资源
	public static void closeSession() {
		//从ThreadLocal中拿取一个session
		Session session = threadLocal.get();
		if(null==session) {
			if(session.isOpen()) {
				//关闭session
				session.close();
			}
			threadLocal.set(null);
		}		
	}
	
	public static void main(String[] args) {
		Session session = openSession();
		System.out.println(session);
		System.out.println("ok");
	}
	
}

get测试类:

package com.liuyongqi.MavenHibernateDemo3.test;

import java.util.Iterator;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.liuyongqi.MavenHibernateDemo3.entity.Book;
import com.liuyongqi.MavenHibernateDemo3.entity.Book_Category;
import com.liuyongqi.MavenHibernateDemo3.util.SessionFactoryUtil;

/**
 * 
 * @author Administrator
 * @data   2018年8月2日
 * @time   下午8:23:03
 */
public class TestGet {
	public static void main(String[] args) {
		Session session=SessionFactoryUtil.openSession();
		Transaction transaction = session.beginTransaction();
		Book_Category book_Category = session.get(Book_Category.class, 1);
		System.out.println("aaa");
		System.out.println("bbb");
		System.out.println("分类名:"+book_Category.getBook_category_name());
		transaction.commit();
		SessionFactoryUtil.closeSession();

	}

}

控制台结果:

Hibernate: 
    select
        book_categ0_.book_category_id as book_cat1_1_0_,
        book_categ0_.book_category_name as book_cat2_1_0_ 
    from
        book_category book_categ0_ 
    where
        book_categ0_.book_category_id=?
aaa
bbb
分类名:文学

load测试类:

package com.liuyongqi.MavenHibernateDemo3.test;

import java.util.Iterator;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.liuyongqi.MavenHibernateDemo3.entity.Book;
import com.liuyongqi.MavenHibernateDemo3.entity.Book_Category;
import com.liuyongqi.MavenHibernateDemo3.util.SessionFactoryUtil;

/**
 * 
 * @author Administrator
 * @data   2018年8月2日
 * @time   下午8:23:03
 */
public class TestLoad {
	public static void main(String[] args) {	
		Session session=SessionFactoryUtil.openSession();
		Transaction transaction = session.beginTransaction();
		Book_Category book_Category = session.load(Book_Category.class, 1);
		System.out.println("aaa");
		System.out.println("bbb");
		System.out.println("分类名:"+book_Category.getBook_category_name());
		transaction.commit();		
		SessionFactoryUtil.closeSession();
	}

}

控制台结果:

aaa
bbb
Hibernate: 
    select
        book_categ0_.book_category_id as book_cat1_1_0_,
        book_categ0_.book_category_name as book_cat2_1_0_ 
    from
        book_category book_categ0_ 
    where
        book_categ0_.book_category_id=?
分类名:文学

很明显能看出他们的不一样,延迟加载:不用的时候不会调用sql语句,用的时候在调

 

总结:

1、set/list默认下是lazy=true的。支持懒加载,但是当使用size()的时候依然要去查询整个set集合的内容。

2、lazy=false时,立即查询所有集合的内容。

3、lazy=extra时,比较智能,支持懒加载,当使用size()的时候不会查询整个集合,仅仅查询集合元素的个数。当需要使用集合元素的内容时,再去查询集合内容。

如果大家想浏览我的下一篇文章,请留言

此文章属于原创,不准转载:https://blog.csdn.net/LYQ2332826438

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银色亡灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值