网站建设长尾关键词,网站流量报表,华大 建设网站,wordpress 乐视云文章目录 示例代码放到最后#xff0c;使用的是Springboot 项目1. 简介2. Hibernate抓取策略分类2.1 即时加载#xff08;Eager Loading#xff09;2.2 延迟加载#xff08;Lazy Loading#xff09;2.3 子查询加载#xff08;Subselect Loading#xff09;2.4 基于批处理… 文章目录 示例代码放到最后使用的是Springboot 项目1. 简介2. Hibernate抓取策略分类2.1 即时加载Eager Loading2.2 延迟加载Lazy Loading2.3 子查询加载Subselect Loading2.4 基于批处理的加载Batch Loading 3. 即时加载Eager Loading3.1 概述3.2 实体类映射配置3.3 使用场景和注意事项 4. 延迟加载Lazy Loading4.1 概述4.2 实体类映射配置4.3 使用场景和注意事项 5. 子查询加载Subselect Loading5.1 概述5.2 实体类映射配置5.3 使用场景和注意事项 6. 基于批处理的加载Batch Loading6.1 概述6.2 实体类映射配置6.3 使用场景和注意事项 7. 总结Demo 示例代码放到最后使用的是Springboot 项目
1. 简介
本文将深入讨论Hibernate中的抓取策略介绍不同类型的抓取策略以及它们的使用场景和注意事项。
2. Hibernate抓取策略分类
2.1 即时加载Eager Loading
即时加载是指在查询主实体时立即加载相关联的实体对象。这种策略会在查询时一次性加载所有关联的实体对象可以减少数据库查询次数。
2.2 延迟加载Lazy Loading
延迟加载是指在访问关联属性时才会真正加载相关的实体对象。这种策略在查询主实体时只会加载主实体对象而关联的实体对象只有在被访问时才会被加载。
2.3 子查询加载Subselect Loading
子查询加载是指通过执行子查询来加载关联的实体集合对象而不是通过单独的SQL语句执行关联查询。这种策略适用于一对多或多对多关系并可以提高性能。
2.4 基于批处理的加载Batch Loading
基于批处理的加载是指通过执行批量SQL语句一次性加载多个实体对象。这种策略可以减少数据库交互次数提高性能。
3. 即时加载Eager Loading
3.1 概述
即时加载策略可以通过设置ManyToOne、OneToOne等注解来实现默认情况下Hibernate会使用即时加载进行关联对象的加载。
3.2 实体类映射配置
在关联属性上使用fetch FetchType.EAGER注解来指定即时加载策略。
Entity
Data
public class Classes {Idprivate int id;private String name;OneToMany(mappedBy classes, fetch FetchType.EAGER)private ListStudent students;
}这里可以看到查询的班级实体种student属性集合有二十个对象
3.3 使用场景和注意事项
适用于关联实体对象数据量较小且经常被使用的情况。频繁加载大量关联对象可能导致性能问题需要谨慎使用。
4. 延迟加载Lazy Loading
4.1 概述
延迟加载策略可以通过设置ManyToOne、OneToOne等注解来实现默认情况下Hibernate会使用延迟加载进行关联对象的加载。
4.2 实体类映射配置
在关联属性上使用fetch FetchType.LAZY注解来指定延迟加载策略。
Entity
public class Classes{// ...OneToMany(mappedBy classes, fetch FetchType.LAZY)private ListStudent students;// ...
}这里开启懒加载后查询到的对象种数据是空的只有当执行get方法时才会去获取数据 4.3 使用场景和注意事项
适用于关联实体对象数据量较大或者不经常被使用的情况可以减少不必要的数据库查询。注意检查在延迟加载策略下可能引发的懒加载异常需要合理处理。
5. 子查询加载Subselect Loading
5.1 概述
子查询加载策略通过执行子查询来加载关联的实体集合对象适用于一对多或多对多关系。
5.2 实体类映射配置
在关联集合属性上使用Fetch注解并指定Fetch(FetchMode.SUBSELECT)来启用子查询加载策略。
Entity
public class Order {// ...OneToMany(mappedBy order)Fetch(FetchMode.SUBSELECT)private ListOrderItem orderItems;// ...
}5.3 使用场景和注意事项
适用于一对多或多对多的关联关系减少关联集合对象的查询次数提高性能。子查询加载策略会执行多条SQL语句需要考虑数据库性能和查询效率的平衡。
6. 基于批处理的加载Batch Loading
6.1 概述
基于批处理的加载策略通过执行批量SQL语句一次性加载多个实体对象减少数据库交互次数提高性能。
6.2 实体类映射配置
在关联集合属性上使用BatchSize注解并指定要批量加载的大小。
Entity
public class Order {// ...OneToMany(mappedBy order)BatchSize(size 10)private ListOrderItem orderItems;// ...
}BatchSize 注解的作用是为了优化 Hibernate 对关联集合属性的查询性能。它可以应用于实体类的集合属性上告诉 Hibernate 在加载该集合属性时一次性加载指定个数的数据从而减少数据库查询次数。
具体来说BatchSize 注解会影响到使用延迟加载FetchType.LAZY的关联集合属性的时候。当访问该集合属性时如果该属性还没有被初始化Hibernate 会触发查询加载数据。通过设置 BatchSize 注解可以控制同时加载的数据量从而减少数据库查询的次数。
例如假设我们有一个 EntityA 实体类其中包含一个 ListEntityB 类型的集合属性我们可以在该属性上添加 BatchSize 注解来优化查询性能
Entity
public class EntityA {// ...OneToMany(mappedBy entityA, fetch FetchType.LAZY)BatchSize(size 10) // 在这里添加注解private ListEntityB entityBList;// getters and setters
}在这个例子中将 BatchSize(size 10) 注解应用于 entityBList 属性上。当访问 entityBList 属性时Hibernate 会一次性加载 10 条 EntityB 数据从而减少查询次数提高性能。
需要注意的是BatchSize 注解只对延迟加载的集合属性有效对于即时加载FetchType.EAGER的集合属性无效。此外它只影响到关联集合属性本身的加载不会影响到关联实体对象的加载。
总结来说BatchSize 注解可以优化延迟加载的关联集合属性的查询性能通过一次加载多个数据项减少数据库查询次数。但需要根据具体情况选择合适的批处理大小并综合考虑内存消耗和查询性能。
6.3 使用场景和注意事项
适用于一对多或多对多的关联关系减少数据库交互次数提高性能。需要根据实际情况调整批量加载的大小避免一次性加载过多数据导致内存占用过大。
7. 总结
Hibernate提供了多种抓取策略用于加载关联实体对象包括即时加载、延迟加载、手动加载、子查询加载和基于批处理的加载。选择合适的抓取策略可以提高查询性能和减少数据库交互次数但需要根据实际情况和性能要求进行综合考虑。
Demo
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;
Entity
Data
public class Classes {Idprivate int id;private String name;
// OneToMany(mappedBy classes)
// private ListStudent students;//子查询加载
// OneToMany(mappedBy classes)
// Fetch(FetchMode.SUBSELECT)
// private ListStudent students;//基于批处理的加载OneToMany(mappedBy classes)BatchSize(size 6)private ListStudent students;public void loadCustomer() {// 手动加载关联的Customer对象Hibernate.initialize(students);}}import lombok.Data;
import javax.persistence.*;Entity
Data
public class Student {IdGeneratedValue(strategy GenerationType.IDENTITY)private int id;private String name;ManyToOne(fetch FetchType.EAGER)private Classes classes;}public interface JPAClassesDao extends JpaRepositoryClasses, Integer, Serializable {
}
public interface JPAStudentDao extends JpaRepositoryStudent, Integer , Serializable {
}
AutowiredJPAStudentDao jpastudentDao;AutowiredJPAClassesDao jpaclassesDao;
// Resource
// private SessionFactory factory;RequestMapping(/Insert)public void InsertClassesTest(){ListClasses anew ArrayList();ListStudent snew ArrayList();for (int i 0; i 10; i) {Classes bnew Classes();b.setId(i);b.setName(班级i);a.add(b);for (int j 0; j 20; j) {Student cnew Student();c.setClasses(b);c.setName(学生ij);s.add(c);}}jpaclassesDao.saveAll(a);jpastudentDao.saveAll(s);}RequestMapping(/QueryEAGER)public void queryEAGERTest(){Classes byId jpaclassesDao.findById(0).get();for (Student student : byId.getStudents()) {System.out.println(班级byId.getName()的student.getName());}}RequestMapping(/QueryLAZY)public void queryLAZYTest(){Classes byId jpaclassesDao.getOne(1);System.out.println(--------------------------------------);for (Student student : byId.getStudents()) {System.out.println(班级byId.getName()的student.getName());}}RequestMapping(/QueryTriggerLAZY)public void queryTriggerTest(){Classes byId jpaclassesDao.getOne(1);// byId.loadCustomer();for (Student student : byId.getStudents()) {System.out.println(班级byId.getName()的student.getName());}}RequestMapping(/QuerySubselect)public void querySubselectTest(){Classes byId jpaclassesDao.getOne(1);for (Student student : byId.getStudents()) {System.out.println(班级byId.getName()的student.getName());}}!-- hibernate依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency