(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 SetDepartment.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。另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
本文名称:(11)Hibernate懒加载-创新互联
当前地址:http://ybzwz.com/article/codosj.html