JPA 延迟加载在 Spring 引导中不起作用

新手上路,请多包涵

我在谷歌上搜索了很多,Spring Boot(最新版本)可能没有延迟加载是行不通的,这真的很奇怪。以下是我的代码片段:

我的资源:

  public ResponseEntity<Page<AirWaybill>> searchAirWaybill(CriteraDto criteriaDto, @PageableDefault(size = 10) Pageable pageable{
airWaybillService.searchAirWaybill(criteriaDto, pageable);
        return ResponseEntity.ok().body(result);
}

我的服务:

 @Service
@Transactional
public class AirWaybillService {

//Methods

 public Page<AirWaybill> searchAirWaybill(AirWaybillCriteriaDto searchCriteria, Pageable pageable){
    //Construct the specification
            return airWaybillRepository.findAll(spec, pageable);
   }
}

我的实体:

 @Entity
@Table(name = "TRACKING_AIR_WAYBILL")
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@airWaybillId") //to fix Infinite recursion with LoadedAirWaybill class
public class AirWaybill{
//Some attributes
    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "FK_TRACKING_CORPORATE_BRANCH_ID")
    private CorporateBranch corporateBranch;
}

并且在调试时,我仍然加载了所有延迟加载的属性。见下图。

在此处输入图像描述

我的问题之一是杰克逊会参与这种行为吗?有没有什么方法我可能错过了激活延迟加载?

编辑

另一个问题,调试器是否会参与破坏延迟加载?

编辑 2:

对于 规范 构建,我有:

 public static Specification<AirWaybill> isBranchAirWayBill(long id){
    return new Specification<AirWaybill>() {
        @Override
        public Predicate toPredicate(Root<AirWaybill> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            return cb.equal(root.join("corporateBranch",JoinType.LEFT).get("id"),id);
        }
    };
}

原文由 Hossam Badri 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 447
2 个回答

Hibernate Session 存在于 @Transactional 的方法中。在服务类之外传递实体是一种不好的做法,因为会话在离开您的 search 方法后被关闭。另一方面,您的实体包含惰性初始化集合,一旦会话关闭就无法将其拉出。

好的做法是将实体映射到传输对象并从服务返回这些传输对象(而不是原始实体)。

原文由 Tomasz Białecki 发布,翻译遵循 CC BY-SA 4.0 许可协议

SpringBoot 默认开启了:

spring.jpa.open-in-view = true

这意味着交易始终是开放的。尝试禁用它。

更多信息 在这里

原文由 Martin Čuka 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题