亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

(11)Hibernate懶加載

發布時間:2020-07-02 23:03:50 來源:網絡 閱讀:497 作者:lsieun 欄目:數據庫


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








向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延川县| 辽中县| 轮台县| 连山| 恩平市| 荥经县| 分宜县| 宁城县| 宁陵县| 大安市| 晋州市| 衢州市| 开平市| 石首市| 宣汉县| 西贡区| 隆尧县| 乌拉特前旗| 张家界市| 乐东| 清水县| 双柏县| 浠水县| 梁山县| 将乐县| 扎赉特旗| 灵石县| 乌兰浩特市| 河间市| 永昌县| 勐海县| 普陀区| 思南县| 五大连池市| 多伦县| 隆德县| 朝阳县| 三穗县| 乌恰县| 安图县| 德化县|