我的编程空间,编程开发者的网络收藏夹
学习永远不晚

(11)Hibernate懒加载

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

(11)Hibernate懒加载


1、get、load方法区别?

get: 及时加载,只要调用get方法立刻向数据库查询

load:默认使用懒加载,当用到数据的时候才向数据库查询。

2、懒加载(lazy)


2.1、概念

概念:当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性。

目的:提升程序执行效率!

2.2、lazy属性的值

在Hibernate中,懒加载对应lazy属性的值。

lazy属性的值
序号含义
1true使用懒加载
2false关闭懒加载
3extra

在集合属性(配置当中使用set标签)懒加载的时候提升效率

在真正使用数据的时候才向数据库发送查询的sql;

如果调用集合的size()/isEmpty()方法,只是统计,不真正查询数据!



2.3、懒加载异常

(1)Session关闭后,不能使用懒加载数据!

(2)如果session关闭后,使用懒加载数据报错:org.hibernate.LazyInitializationException: could not initialize proxy - no Session

(3)如何解决session关闭后不能使用懒加载数据的问题?

方式1: 先使用一下数据

dept.getDeptName();

方式2:强迫代理对象初始化

Hibernate.initialize(dept);

方式3:关闭懒加载

在.hbm.xml配置文件中设置lazy=false;

方式4: 在使用数据之后,再关闭session!

方式1和方式4的区别是:方式1是说,如果想在关闭Session后,仍然想用懒加载的数据,可以先使用一下需要懒加载的数据,这样就会提前加载那些数据;方式4是说,既然懒加载的数据在Session关闭后不能再进行访问,那么它就想办法延迟Session的关闭。


3、示例代码

Department.java

package com.rk.hibernate.j_lazy;

import java.util.Set;

public class Department
{
	private int deptId;
	private String deptName;
	private Set<Employee> emps;
	public int getDeptId()
	{
		return deptId;
	}
	public void setDeptId(int deptId)
	{
		this.deptId = deptId;
	}
	public String getDeptName()
	{
		return deptName;
	}
	public void setDeptName(String deptName)
	{
		this.deptName = deptName;
	}
	
	public Set<Employee> getEmps()
	{
		return emps;
	}
	public void setEmps(Set<Employee> emps)
	{
		this.emps = emps;
	}
	@Override
	public String toString()
	{
		return "Deparment [deptId=" + deptId + ", deptName=" + deptName + "]";
	}
	
}

Department.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.rk.hibernate.j_lazy" auto-import="true">
	<!-- class标签内可以设置lazy属性 -->
	<class name="Department" table="T_Department" lazy="false">
		<id name="deptId" column="id">
			<generator class="native"></generator>
		</id>
		<property name="deptName" column="name"></property>
		<!-- 
			集合属性,默认使用懒加载 
			lazy
				true 懒加载
				extra 懒加载(智能)
				false 关闭懒加载
		
		-->
		<set name="emps" table="T_Employee" lazy="extra">
			<key column="deptId"></key>
			<one-to-many class="Employee"/>
		</set>
	</class>
</hibernate-mapping>

Employee.java

package com.rk.hibernate.j_lazy;

public class Employee
{
	private int empId;
	private String empName;
	private int salary;
	private Department  dept;
	public int getEmpId()
	{
		return empId;
	}
	public void setEmpId(int empId)
	{
		this.empId = empId;
	}
	public String getEmpName()
	{
		return empName;
	}
	public void setEmpName(String empName)
	{
		this.empName = empName;
	}
	public int getSalary()
	{
		return salary;
	}
	public void setSalary(int salary)
	{
		this.salary = salary;
	}
	public Department getDept()
	{
		return dept;
	}
	public void setDept(Department dept)
	{
		this.dept = dept;
	}
	@Override
	public String toString()
	{
		return "Employee [empId=" + empId + ", empName=" + empName + ", salary=" + salary + "]";
	}
	
}

Employee.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.rk.hibernate.j_lazy" auto-import="true">
	<class name="Employee" table="T_Employee">
		<id name="empId" column="id">
			<generator class="native"></generator>
		</id>
		<property name="empName" column="name"></property>
		<property name="salary" column="salary"></property>
		<many-to-one name="dept" column="deptId" class="Department"></many-to-one>
	</class>
</hibernate-mapping>

App.java

package com.rk.hibernate.j_lazy;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App
{
	private static SessionFactory sf;
	static
	{
		sf = new Configuration()
						.configure()
						.addClass(Department.class)
						.addClass(Employee.class)
						.buildSessionFactory();
	}
	
	//1. 主键查询,get和load的区别
	//这里是对JavaBean类的懒加载
	@Test
	public void testClassGetLoad()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		// get: 及时查询
//		Department dept = (Department)session.get(Department.class, 1);
//		System.out.println(dept.getDeptName());
//		System.out.println(dept.getEmps());
		
		// load,默认懒加载, 及在使用数据的时候,才向数据库发送查询的sql语句!
		Department dept = (Department)session.load(Department.class, 1);
		// 方式1: 先使用一下数据
		// dept.getDeptName();
		// 方式2:强迫代理对象初始化
		// Hibernate.initialize(dept);
		// 方式3:关闭懒加载
		// 配置文件中将lazy设置为false。<class name="Department" table="T_Department" lazy="false">

		session.getTransaction().commit();
		session.close();
		
		// session关闭后,是否能够使用
		System.out.println(dept.getDeptName());
	}
	
	//2.这里是对属性(外键关联)的懒加载
	@Test
	public void testProperty()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		Department dept = (Department)session.get(Department.class, 1);
		System.out.println(dept.getDeptName());
		System.out.println("--------------------------");
		System.out.println(dept.getEmps().size());
		System.out.println(dept.getEmps().isEmpty());
		System.out.println(dept.getEmps());
		
		session.getTransaction().commit();
		session.close();
	}
}








免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

(11)Hibernate懒加载

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

hibernate中利用 fetch=FetchType.LAZY 懒加载失败如何解决

本篇文章为大家展示了hibernate中利用 fetch=FetchType.LAZY 懒加载失败如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对这种懒加载问题,最后的做法是利用Spring
2023-05-31

python反爬之懒加载

# 在平时的爬虫中,如果遇到没有局部刷新,没有字体加密,右键检查也能看到清晰的数据,但是按照已经制定好的解析规则进行解析时,会返回空数据,这是为什么呢,这时可以在网页右键查看一下网页源代码,可以发现,在网页上的源代码中有些部分是正确的,有些
2023-01-30

什么是react懒加载

react懒加载是指不会预加载,而是需要使用某段代码,某个组件或者某张图片时才加载;之所以需要懒加载,是因为在首屏同时加载过多的内容,会导致卡顿不流畅响应速度慢、用户等待时间过长等问题,对此可以使用懒加载机制来进行优化。
2023-05-14

VUE懒加载进阶指南:实现更丰富的懒加载效果

Vue 懒加载进阶指南:实现更丰富的懒加载效果 Vue.js 懒加载 图片懒加载 滚动加载 瀑布流加载 无限滚动 Vue.js 作为一款优秀的渐进式 JavaScript 框架,提供了一系列强大的特性来帮助开发者构建复杂的单页面应用。其中,懒加载功能可以有效地提高页面的加载速度,从而改善用户体验。在本文中,我们将深入探讨 Vue.js 懒加载的进阶指南,帮助您实现更丰富、更灵活的懒加载效果。
VUE懒加载进阶指南:实现更丰富的懒加载效果
2024-02-13

webpack如何实现懒加载和预加载

小编给大家分享一下webpack如何实现懒加载和预加载,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!正常加载为了看的方便,index.js中的代码非常简单console.log(index.js执行了)import { t
2023-06-22

MyBatis懒加载如何实现

这篇文章主要介绍“MyBatis懒加载如何实现”,在日常操作中,相信很多人在MyBatis懒加载如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyBatis懒加载如何实现”的疑惑有所帮助!接下来,请跟
2023-06-30

VUE懒加载实战教程:让你快速掌握图片懒加载技术

VUE懒加载技术是一种图片加载优化技术,可以有效提高网站的加载速度和用户体验。本文将介绍VUE懒加载的原理、实现方法和使用技巧,帮助你快速掌握图片懒加载技术。
VUE懒加载实战教程:让你快速掌握图片懒加载技术
2024-02-13

react懒加载怎么使用

这篇文章主要介绍“react懒加载怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react懒加载怎么使用”文章能帮助大家解决问题。react懒加载是指不会预加载,而是需要使用某段代码,某个组
2023-07-04

VUE懒加载原理详解:一文带你读懂图片懒加载的奥秘

懒加载是一种通过延迟加载资源,以提高网页加载速度和性能的技术。它可以有效减少初始页面加载时间,从而提高用户体验和网站排名。本文将详细讲解 VUE 懒加载的原理,帮助您理解图片懒加载的奥秘。
VUE懒加载原理详解:一文带你读懂图片懒加载的奥秘
2024-02-13

编程热搜

目录