您好,登錄后才能下訂單哦!
get: 及時加載,只要調用get方法立刻向數據庫查詢
load:默認使用懶加載,當用到數據的時候才向數據庫查詢。
概念:當用到數據的時候才向數據庫查詢,這就是hibernate的懶加載特性。
目的:提升程序執行效率!
在Hibernate中,懶加載對應lazy屬性的值。
序號 | 值 | 含義 |
---|---|---|
1 | true | 使用懶加載 |
2 | false | 關閉懶加載 |
3 | extra | 在集合屬性(配置當中使用set標簽)懶加載的時候提升效率 在真正使用數據的時候才向數據庫發送查詢的sql; 如果調用集合的size()/isEmpty()方法,只是統計,不真正查詢數據! |
(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的關閉。
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(); } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。