我有一个具有OnetoOne
关系的Student
类。
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "status_id")
private StudentStatus statusID;
这是控制器:
public Page<StudentDTO> getAllStudents(@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(name = "filter", required = false) String fieldName,
@RequestParam(name = "value", required = false) String fieldValue) {
Pageable pageable = PageRequest.of(page, size);
Specification<Student> spec = StudentSpecification.hasFieldWithValueLike(fieldName,fieldValue);
return studentService.getStudents(spec, pageable);}
售后服务:
public Page<StudentDTO> getStudents(Specification<Student> spec, Pageable pageable) {
Page<Student> studentPage = studentRepository.findAll(spec, pageable);
return studentPage.map(student -> studentMapper.toDTO(student));}
我知道我的lazy fetch是成功的,因为它返回了一个额外的字段:hibernateLazyInitializer
。
从我的理解来看,从GET
返回的json不会有任何延迟获取字段StudentStatus
的数据,但响应仍然有StudentStatus
的所有值。
我还使用JMeter对10000个请求的API进行了基准测试。看起来没有lazy fetch,它实际上平均快了2ms。
1条答案
按热度按时间nkhmeac61#
这正是Hibernate延迟加载的工作方式。
StudentStatus
将不会使用findAll
方法获取。它只会被一个代理所取代。然而,在下一行中,Map器访问statusID
字段的getter,导致Hibernate使用额外的select语句获取StudentStatus
实体。这当然需要一些额外的时间。如果您不需要
StudentDTO
中的StudentStatus
,则可以将其从Map器中删除。