(11)Hibernate懒加载
发表于:2024-10-04 作者:千家信息网编辑
千家信息网最后更新 2024年10月04日,1、get、load方法区别?get: 及时加载,只要调用get方法立刻向数据库查询load:默认使用懒加载,当用到数据的时候才向数据库查询。2、懒加载(lazy)2.1、概念概念:当用到数据的时候才
千家信息网最后更新 2024年10月04日(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 Setemps; 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安全错误
数据库的锁怎样保障安全
泄露 数据库下载
网络安全军地两用
服务器外置光驱
西城区正规软件开发技术指导
qq网络安全风险
最新饲料原料数据库
中关村服务器在线官网
长宁区智能网络技术创新服务
大麦网络打印服务器手机设置
软件开发15K白菜价
口碑好的浪潮存储服务器供货商
数据库设计文档的作用
windows是什么数据库
数据库应用技术第二章测试题
人工智能软件开发上市公司
数据库怎么实现加锁
isc网络安全行政令
MCU软件开发定义
互联网齐屹科技
网络安全演习app
万方数据库上传要多久
网页制作如何连接数据库
蚌埠视频点播软件开发要多少钱
三国志战略版2678服务器
服务器不支持安全链接
致远宣大网络技术有限公司
方舟手游怎么开官方服务器
池州门店管理软件开发多少钱
做网络安全的工程师
美信网络技术公司靠谱吗