(11)Hibernate懒加载
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,1、get、load方法区别?get: 及时加载,只要调用get方法立刻向数据库查询load:默认使用懒加载,当用到数据的时候才向数据库查询。2、懒加载(lazy)2.1、概念概念:当用到数据的时候才
千家信息网最后更新 2025年11月07日(11)Hibernate懒加载
1、get、load方法区别?
get: 及时加载,只要调用get方法立刻向数据库查询
load:默认使用懒加载,当用到数据的时候才向数据库查询。
2、懒加载(lazy)
2.1、概念
概念:当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性。
目的:提升程序执行效率!
2.2、lazy属性的值
在Hibernate中,懒加载对应lazy属性的值。
| 序号 | 值 | 含义 |
|---|---|---|
| 1 | true | 使用懒加载 |
| 2 | false | 关闭懒加载 |
| 3 | extra | 在集合属性(配置当中使用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 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 getEmps() { return emps; } public void setEmps(Set emps) { this.emps = emps; } @Override public String toString() { return "Deparment [deptId=" + deptId + ", deptName=" + deptName + "]"; } } Department.hbm.xml
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
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。 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(); }}
数据
方式
查询
属性
数据库
时候
方法
配置
对象
效率
文件
概念
代理
中将
代码
办法
只是
含义
就是
序号
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库表为什么不能更改
红蜻蜓截屏软件开发商
小型数据库应用管理系统
mysql数据库查询好慢
第二届大学生网络安全
网络安全法普通企业
相要学软件开发
lr动态链接数据库
平谷区信息化网络技术服务一体化
关于软件开发的法律条例
初中网络安全教育反恐怖
智阳网络技术面试题
中国电信apn服务器怎么设置
cas上服务器忘记密码
当代科技与互联网
区域链数据库安全
金华java软件开发工具
java监听数据库变化
怎么知道自己是否成功连接数据库
国际一线网络安全策略管理
互联网及其网络安全
derby数据库部署
在数据库中建立树形结构
NBA1718数据库
泰安数据库有国有企业吗
代替neo4j的图数据库
1万地形测绘数据库图层名称
mac 登陆远程服务器
网络安全的保护对象
邯郸市网络安全知识