Hibernate是一个流行的开源ORM(对象关系映射)框架,可以将Java对象关联到数据库表。在开发中,为了提高系统性能,开发人员通常会使用懒加载技术,延迟加载需要的数据,而不是在一次完整的数据库查询中同时加载完所有的数据。
在Hibernate中,懒加载的配置是通过在Hibernate映射文件中的
1. 标签上的lazy属性
在Hibernate映射文件中,一个
<class name="example.User" table="user" lazy="true">
在这里,我们使用了lazy属性,它的取值范围为三种:
- true:表示开启懒加载,只有当需要实体类的属性时,才会从数据库中获取数据。
- false:表示关闭懒加载,一旦查询数据库,就会将所有相关数据全部获取到内存中,容易导致内存溢出。
- extra:表示默认允许使用懒加载,但是当Session.close()方法使用之后,仍有需要延迟加载的数据没有加载时,一并加载到内存中。
2. 示例
示例1:在单向一对多关系中使用懒加载
在下面的示例中,我们将介绍如何在单向一对多关系中使用懒加载。
首先,我们定义两个实体类,User和Address,它们之间的关系为一对多关系。
User.java
public class User {
private int userId;
private String name;
private Set<Address> addresses;
// getter和setter省略
}
Address.java
public class Address {
private int addressId;
private String address;
// getter和setter省略
}
然后,我们在Hibernate映射文件中分别定义User和Address的映射关系。需要注意的是,在
User.hbm.xml
<!-- User映射文件 -->
<class name="example.User" table="user" lazy="true">
<id name="userId" type="int">
<generator class="native"/>
</id>
<property name="name" type="string"/>
<set name="addresses" table="address" inverse="true" lazy="true">
<key column="user_id"/>
<one-to-many class="example.Address"/>
</set>
</class>
Address.hbm.xml
<!-- Address映射文件 -->
<class name="example.Address" table="address" lazy="true">
<id name="addressId" type="int">
<generator class="native"/>
</id>
<property name="address" type="string"/>
<many-to-one name="user" column="user_id" class="example.User"/>
</class>
最后,我们使用Hibernate来查询User实体类,并且获取它的所有地址,然后打印出来。
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1);
Set<Address> addresses = user.getAddresses();
for (Address address : addresses) {
System.out.println(address.getAddress());
}
transaction.commit();
session.close();
}
在上面的代码中,由于我们在
示例2:在双向一对多关系中使用懒加载
在下面的示例中,我们将介绍如何在双向一对多关系中使用懒加载。在这里,我们需要定义两个实体类,一个是主实体类,另一个是从实体类,从实体类中包含了对主实体类的引用。
首先,我们定义两个实体类,User和Address,它们之间的关系为双向一对多关系。
User.java
public class User {
private int userId;
private String name;
private Set<Address> addresses;
// getter和setter省略
}
Address.java
public class Address {
private int addressId;
private String address;
private User user;
// getter和setter省略
}
然后,我们在Hibernate映射文件中分别定义User和Address的映射关系。需要注意的是,在
User.hbm.xml
<!-- User映射文件 -->
<class name="example.User" table="user" lazy="true">
<id name="userId" type="int">
<generator class="native"/>
</id>
<property name="name" type="string"/>
<set name="addresses" table="address" inverse="true" lazy="true">
<key column="user_id"/>
<one-to-many class="example.Address"/>
</set>
</class>
Address.hbm.xml
<!-- Address映射文件 -->
<class name="example.Address" table="address" lazy="true">
<id name="addressId" type="int">
<generator class="native"/>
</id>
<property name="address" type="string"/>
<many-to-one name="user" column="user_id" not-null="true" class="example.User" lazy="true"/>
</class>
最后,我们使用Hibernate来查询User实体类,并且获取它的所有地址,然后打印出来。
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1);
Set<Address> addresses = user.getAddresses();
for (Address address : addresses) {
System.out.println(address.getAddress());
}
transaction.commit();
session.close();
}
在上面的代码中,由于我们在
到此为止,我们就讲解了如何在Hibernate中使用
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Hibernate懒加载之