延遲載入與預先載入
獲取或載入資料可以主要分為兩種型別:渴望和懶惰。
為了使用 Hibernate,請確保將其最新版本新增到 pom.xml 檔案的 dependencies 部分:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.1.Final</version>
</dependency>
1.急切載入和延遲載入
我們在這裡要討論的第一件事是延遲載入和急切載入:
Eager Loading 是一種設計模式,可以在現場進行資料初始化。這意味著在獲取父級時完全獲取集合(立即獲取)
延遲載入是一種設計模式,用於將物件的初始化推遲到需要它的點。這可以有效地提高應用程式的效能。
2.使用不同型別的載入
可以使用以下 XML 引數啟用延遲載入:
lazy="true"
讓我們深入研究這個例子。首先我們有一個 User 類:
public class User implements Serializable {
private Long userId;
private String userName;
private String firstName;
private String lastName;
private Set<OrderDetail> orderDetail = new HashSet<>();
//setters and getters
//equals and hashcode
}
看看我們擁有的 orderDetail 集。現在讓我們來看看 OrderDetail 類 :
public class OrderDetail implements Serializable {
private Long orderId;
private Date orderDate;
private String orderDesc;
private User user;
//setters and getters
//equals and hashcode
}
在 UserLazy.hbm.xml
中設定延遲載入所涉及的重要部分:
<set name="orderDetail" table="USER_ORDER" inverse="true" lazy="true" fetch="select">
<key>
<column name="USER_ID" not-null="true" />
</key>
<one-to-many class="com.baeldung.hibernate.fetching.model.OrderDetail" />
</set>
這是啟用延遲載入的方式。要禁用延遲載入,我們可以簡單地使用:lazy = "false"
,這反過來將啟用預先載入。以下是在另一個檔案 User.hbm.xml 中設定 eager 載入的示例:
<set name="orderDetail" table="USER_ORDER" inverse="true" lazy="false" fetch="select">
<key>
<column name="USER_ID" not-null="true" />
</key>
<one-to-many class="com.baeldung.hibernate.fetching.model.OrderDetail" />
</set>