簡體   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