1. 程式人生 > >Hibernate中的延遲載入(懶載入)

Hibernate中的延遲載入(懶載入)

什麼是懶載入?

 Hibernate提供了一種機制,即在設定了使用懶載入的情況下,查詢某一條資料時不會立即訪問資料庫,因此不會返回指定物件,而是返回代理物件,該代理物件並不為null,它實際上是Hibernate自動實現的指定物件所屬類的子類的物件,該物件具有預設值.當要使用真正物件的屬性的時候才會訪問資料庫,這時代理物件會自動查詢資料庫中對應物件的資料並返回.

這樣一來降低了程式對資料庫訪問次數和記憶體使用量.下面我們通過懶載入適用情況分析它究竟是如何做到的.

  懶載入的適用情況?

1.獲取某一個物件資料時

Hibernate中的查詢方法有兩個:get()load(),正如上面介紹什麼是懶載入一樣

,呼叫load()可以使用懶載入的特性,但使用get()就不行了.當呼叫session上的load()載入一個實體時,如果頁面並沒有調到除主鍵外的其他屬性,是不會查詢資料庫的,而只有要得到非主鍵屬性時才會去查詢,傳送查詢語句.

2.獲取某一個物件的集合屬性值時(一對多/多對多關聯)

在這種情況下,主表的每一個記錄都關聯了從表的多條記錄,如果沒有懶載入,每查詢一個主表記錄都會連帶查詢出關聯的所有從表記錄.舉個例子,班級關聯了學生:

classes.java:

	/**
	 * 行政班中的學生
	 */
	@OneToMany(cascade=CascadeType.ALL,mappedBy="classes",fetch=FetchType.LAZY,
			targetEntity=Student.class)
	@JsonIgnore
	private Set<Student> students =new HashSet<Student>();

Student.java:


	/**
	 * 學生所屬行政班
	 */
	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = Classes.class)
	@JoinColumn(name = "calssesId", nullable = false)
	private Classes classes;

在查詢班級資訊時,因為暫時不需要展示學生資訊,因此並不希望把班級下面關聯的所有學生都查詢出來,因為這樣會大大增加與資料庫互動的成本.採用懶載入,Hibernate會先返回一個代理物件然後在需要展示學生資訊的時候自動傳送語句查詢相關資料

.

3.獲取某一個物件所關聯的另一個物件時(一對一/多對一關聯)

一對一和多對一的關聯方式相同,在一對一關聯中懶載入並不常用,因為主表中的每一條資料只對應從表的一條資料,就算全部查詢也不會太多.而多對一關聯預設是懶載入的.

懶載入的基本原理和適用情況就是這樣,因為懶載入涉及到session開閉的問題,所以當延遲載入某些屬性時可能session已經關閉了,這時候就會出現懶載入異常.解決這個問題也非常簡單,但前提是session在一個容器中,關於這部分的大餐,我們明天繼續享用.