延迟加载与预先加载
获取或加载数据可以主要分为两种类型:渴望和懒惰。
为了使用 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>