广告
返回顶部
首页 > 资讯 > 数据库 >(11)Hibernate懒加载
  • 532
分享到

(11)Hibernate懒加载

2024-04-02 19:04:59 532人浏览 安东尼
摘要

1、get、load方法区别?get: 及时加载,只要调用get方法立刻向数据库查询load:默认使用懒加载,当用到数据的时候才向数据库查询。2、懒加载(lazy)2.1、概念概念:当用到数据的时候才向数据


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








您可能感兴趣的文档:

--结束END--

本文标题: (11)Hibernate懒加载

本文链接: https://www.lsjlt.com/news/39665.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • (11)Hibernate懒加载
    1、get、load方法区别?get: 及时加载,只要调用get方法立刻向数据库查询load:默认使用懒加载,当用到数据的时候才向数据库查询。2、懒加载(lazy)2.1、概念概念:当用到数据的时候才向数据...
    99+
    2022-10-18
  • hibernate中利用 fetch=FetchType.LAZY 懒加载失败如何解决
    本篇文章为大家展示了hibernate中利用 fetch=FetchType.LAZY 懒加载失败如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对这种懒加载问题,最后的做法是利用Spring...
    99+
    2023-05-31
    hibernate %type
  • hibernate加载流程
    Configuration configuration = new Configuration();创建加载配置文件的对象configuration.configure();1.加载配置文件 hi...
    99+
    2022-10-18
  • 如何解决hibernate一对多注解懒加载失效问题
    目录hibernate一对多注解懒加载失效经排查,问题出在controller这边解决方法Hibernate懒加载异常说明及其解决懒加载异常出现的原因解决方案1解决方案2解决方案3h...
    99+
    2022-11-12
  • EntityFrameworkCore延迟加载(懒加载)用法
    众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载。不过现在EF Co...
    99+
    2022-11-13
  • uni-app image懒加载
     1、uni-app官方给的文档注意看 lazy-loadBooleanfalse图片懒加载。只针对page与scroll-view下的image有效微信小程序、百度小程序、字节跳动小程序、飞书小程序 只针对page与scroll-vie...
    99+
    2023-10-20
    uni-app 微信小程序 小程序
  • JavaScript懒加载详解
    目录懒加载CSS样式:HTML部分:script部分 :总结懒加载 顾名思义比较懒,不想全部加载出来,当用户什么时候想看我在加载后面的东西 概括:懒加载其实就是延时加载,即当对象需要...
    99+
    2022-11-12
  • webpack的懒加载和预加载详解
    目录正常加载懒加载预加载没有使用预加载使用预加载总结正常加载 为了看的方便,index.js中的代码非常简单 console.log('index.js执行了') import ...
    99+
    2022-11-12
  • IntersectionObserver懒加载怎么用
    这篇文章给大家分享的是有关IntersectionObserver懒加载怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念IntersectionObserver接口(从属...
    99+
    2022-10-19
  • redis懒加载是什么
    redis懒加载指的是延迟加载,当访问页面时,会把img标签中的src链接设为同一张图片,将其真正的图片地址存储在img标签的自定义属性中,当js监听到该图片元素进入可视窗口时,即将地址存储到src属性中,从而达到懒加载的效果。...
    99+
    2022-10-21
  • 什么是react懒加载
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。什么是react懒加载?React懒加载一、懒加载是什么?为什么需要懒加载?懒加载:不会预加载,而是需要使用某段代码,某个组件或者某张图片时,才加载他们(...
    99+
    2023-05-14
    懒加载 React
  • python反爬之懒加载
    # 在平时的爬虫中,如果遇到没有局部刷新,没有字体加密,右键检查也能看到清晰的数据,但是按照已经制定好的解析规则进行解析时,会返回空数据,这是为什么呢,这时可以在网页右键查看一下网页源代码,可以发现,在网页上的源代码中有些部分是正确的,...
    99+
    2023-01-30
    加载 python
  • javascript实现图片预加载和懒加载
    本文实例为大家分享了javascript实现图片预加载和懒加载的具体代码,供大家参考,具体内容如下 预加载 预加载是预先加载好后面需要用到的资源, 后面使用的时候直接去缓存里取。举个...
    99+
    2022-11-11
  • webpack如何实现懒加载和预加载
    小编给大家分享一下webpack如何实现懒加载和预加载,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!正常加载为了看的方便,index.js中的代码非常简单console.log('index.js执行了')...
    99+
    2023-06-22
  • vue 路由懒加载详情
    目录1、什么是路由懒加载2、路由懒加载的使用1、什么是路由懒加载 官方的解释: 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。 如果我们能把...
    99+
    2022-11-12
  • MyBatis懒加载如何实现
    这篇文章主要介绍“MyBatis懒加载如何实现”,在日常操作中,相信很多人在MyBatis懒加载如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyBatis懒加载如何实现”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • react懒加载怎么使用
    这篇文章主要介绍“react懒加载怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react懒加载怎么使用”文章能帮助大家解决问题。react懒加载是指不会预加载,而是需要使用某段代码,某个组...
    99+
    2023-07-04
  • jquery的懒加载怎么实现
    今天小编给大家分享一下jquery的懒加载怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2022-10-19
  • android fragment懒加载如何实现
    Android Fragment的懒加载可以通过以下步骤实现:1. 在Fragment类中添加一个boolean类型的变量isLoa...
    99+
    2023-08-26
    android fragment
  • JavaScript懒加载与预加载原理与实现详解
    目录1、懒加载1.1、什么是懒加载1.2、为什么要使用懒加载1.3、懒加载的优点1.4、懒加载的原理1.5、懒加载的实现步骤1.6、懒加载的实现方式2、预加载2.1、什么是预加载2....
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作