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