一、fetchtype.lazy簡介
fetchtype.lazy是hibernate提供的一種延遲加載機制。當實體bean或集合被查詢時,默認情況下所有關聯對象都會立即加載,而該實體之後可能會用不到。fetchtype.lazy可以讓關聯對象在需要時再加載。fetchtype.lazy是非常有用的,優化查詢效率,提升系統響應時間。
二、fetchtype.lazy優點
1、提高系統性能
fetchtype.lazy與正常加載的區別在於關聯對象在需要時才加載,這樣可以減少IO操作,提高系統性能。
2、減輕內存消耗
在已有的系統中,隨着關聯實體數量的增加,內存佔用也會隨之增加,fetchtype.lazy可以明顯減輕內存消耗。
3、避免重複查詢
如果非要在查詢時加載所有的關聯實體,那麼在查詢需要的關聯實體時,還需要再次查詢一遍數據庫,而使用fetchtype.lazy則避免了重複查詢。
三、fetchtype.lazy缺點
1、代理對象的使用
使用fetchtype.lazy時,hibernate通過代理對象來實現延遲加載,這樣會增加代碼的複雜度。
2、懶加載會導致內存泄漏
如果關聯對象沒有正確關閉,會導致內存泄漏問題,需要特別注意。
3、浪費數據庫連接
fetchtype.lazy會在檢索實體時使用左外連接,從而導致數據庫連接的浪費。
四、fetchtype.lazy使用方法
1、在實體bean的註解中指定fetchtype.lazy
在註解中指定fetchtype.lazy,hibernate會採用代理對象的方式來加載關聯對象。
@Entity
public class User {
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "card_id")
private Card card;
// ...
}
2、使用fetchtype.lazy的實體對象調用getter方法時自動加載關聯對象
使用fetchtype.lazy的實體對象調用getter方法時,hibernate會自動加載關聯對象。
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = session.get(User.class, 1L);
Card card = user.getCard(); // 使用getter方法,hibernate會自動加載關聯對象
tx.commit();
session.close();
五、fetchtype.lazy使用場景
1、當實體對象或集合不需要關聯對象時,使用fetchtype.lazy可以明顯提高系統性能和響應速度。
2、當關聯對象數量較大時,使用fetchtype.lazy可以減輕內存消耗。
3、當關聯對象查詢比較耗時時,使用fetchtype.lazy避免重複查詢。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/151545.html