繁体   English   中英

SpringBoot + Hibernate JPA Lazy fetching 模式仍然查询实体中的列表

[英]SpringBoot + Hibernate JPA Lazy fetching mode still queries lists in an entity

我正在使用 springboot 和 JPA 做一个 REST API。 我试图在一对多关系中懒惰地获取一个实体。 老师上课。 我可以看到 JPA 完成的 sql 语句,因为我打开了调试选项。

在控制器中,调用路径时一切正常,但我可以看到 JPA 正在执行两个查询。 一份给老师,另一份给课程。 据我所知,直到需要数据并且我不需要它时,延迟加载才会查询。

我已经检查并确认在控制器中,当我检索教师数据时 JPA 不会查询课程,但是在控制器的返回语句之后,某处需要课程并且当我从带有 GET 调用的邮递员。

似乎 LAZY 加载工作正常,但是在控制器 JPA 加载课程列表之后。 如果我执行 EAGER 获取所有内容,则在返回语句之前加载。

我没有写任何代码,因为我猜这个问题比实际更理论。

有谁知道这是如何工作的?

非常感谢!!!!

编辑:

教师桌

@Entity
@Table(name="profesores")
public class Profesor implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @Column(name="nombre")
    private String nombre;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "profesor_id", referencedColumnName = "id")
    private List<Curso> cursos = new ArrayList<>();

}

课程表

@Entity
@Table(name = "curso")
public class Curso implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long curso_id;

    private String nombre;

    @Column(name="profesor_id")
    private Long profesorId;
}

控制器

    @GetMapping("/profesor/{id}")
    public ResponseEntity<?> getProfesor(@PathVariable(value = "id") Long id){
        Profesor p = profesorService.findById(id);
        if(p!=null) {
            ResponseEntity<?> re = new ResponseEntity<>(p, HttpStatus.OK);
            //Just one query executed. I don't know the courses yet
            return re;
        }
        else {
            return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
        }
    }

返回后重新; 声明,在某处,检索课程并为它们查询 JPA。 我不知道控制器调用什么,就像我直接从 PostMan 做的那样。

在返回的 Entity Profesor被序列化以进行响应后,当序列化程序尝试访问courses以进行序列化以进行响应时,JPA 也会加载courses 为了解决这个问题,您可以为响应创建一个响应类(没有courses字段)

public class ProfesorResponse {
    private Long id;
    private String number;
    ...constructor
}

然后将您的实体映射到响应对象中并返回它。

Profesor p = profesorService.findById(id);
ProfesorResponse response = new ProfesorResponse(p.getId(), p.getNumber());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM