当前位置: 首页 > 知识库问答 >
问题:

JPA惰性加载在Spring boot中不起作用

邓开济
2023-03-14

我谷歌了很多,这是真的奇怪的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);
        }
    };
}

共有1个答案

聂奇
2023-03-14

Hibernate会话存在于具有@transactional的方法中。将实体传递到服务类之外是一种糟糕的做法,因为会话在离开search方法之后会被关闭。另一方面,您的实体包含惰性的初始化集合,一旦会话关闭,就无法提取这些集合。

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

 类似资料:
  • 我正在使用Springjpa和龙目岛来定义爪哇豆主题。每个主题都会有很多评论。我的一吨配置是 我创建的restful api是这样的。序列化似乎是问题所在,它总是获取注释。正如Chris所说,我添加了,它似乎解决了问题。但是如果我想加载注释怎么办,不会返回序列化中的注释。

  • 我正在使用JPA2.1(Eclipselink2.5.1)和JBoss7.1。 为什么不工作是懒惰加载? 谢谢

  • 我还有以下两个类,它们是由我的测试模型生成的: 在DBContext的构造函数中,我显式启用了延迟加载,甚至不需要: 后来我打电话给房子列表: 在标记的断点之后,我预期,由于延迟加载,与房屋相关联的所有人员此时都不会加载。我没有访问一个人,为什么要加载他们?但是它们被加载,因为我的调试器向我显示了所有的name属性。 有人能解释一下这种行为吗?为什么惰性加载不起作用?

  • 这组订单应该是惰性加载的,但我得到以下异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.hibernate.lazyInitializationException:未能懒洋洋地初始化Role:...,没有会话或会话被关闭 根本原因:org.hibernate.lazyInitializationExcept

  • 问题内容: 好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类: 在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”: 因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。 但是,我在这里提出我的问题: 1-当我请

  • 请注意,我已经看过类似的问题,我已经解释了为什么它们对我不起作用 我有一个简单Spring boot JPA-Hibernate应用程序,它具有用户和地址之间的一对一映射。(请注意,我对一对多映射没有这个问题) 用户实体 员额1 我还读到spring.jpa.open-in-view defualt值可能是罪魁祸首: 员额2 通过将添加到我的中,我禁用了默认的“在视图中打开”属性 我假设这是因为J