亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Spring Data JPA 處理 POST 請求中的關系

使用 Spring Data JPA 處理 POST 請求中的關系

九州編程 2021-10-13 12:49:35
我有以下實體,CrudRepository每個實體都有一個:@Entityclass Movie {    @Id Long id;    @Column String name;    @ManyToOne Person director;}@Entityclass Person {    @Id Long id;    @Column String name;}我的控制器看起來像這樣:@RestController@RequestMapping("/movies")class MovieController {    private MovieRepository movies = ...;    private PersonRepository people = ...;    @PostMapping    public Movie create(@RequestBody MovieRequest request) {        // Get the director        Person director = people.findById(request.directorId);        // Create the new movie        Movie movie = new Movie();        movie.name = request.name;        movie.director = director;       // Save the new movie       return movies.save(movie);    }}class MovieRequest {    String name;    Long directorId}如您所見,該create方法首先通過其 id 加載導演,然后創建新電影并最后保存它。這會導致兩次訪問數據庫:第一次檢索導演,第二次保存電影。在這種情況下,這不是什么大問題,但可能存在具有很多關系的實體,這意味著可能會執行大量查詢來實現單個插入。問題:我想在單個數據庫操作中保存新電影。有沒有辦法避免初始人員查詢?有沒有更好的方法來處理這樣的情況?
查看完整描述

3 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

沒有辦法告訴代碼Person它需要與您的新Movie. 因此,您確實需要執行查詢并手動進行關聯。

只有當您的端點Person在創建Movie. 然后您可以簡單地執行 2 個保存操作或使用 aCascadeType=ALL進行單個保存操作。


如果您能夠更改請求參數,那么接收完整Person對象而不是接受directorId. 這樣你就可以建立關聯movie.director = director;。

小心這種類似的方法:如果接收到的Person對象沒有存儲在您的數據庫中,您將收到一個異常。


也許您可以為您的Directors. 例如,如果您將所有 Director 都保存在 Redis 中,則可以搜索Director與接收到的對應directorId的然后執行關聯。

當然,您仍然需要進行第二次操作,但它可能比查詢數據庫便宜得多。


查看完整回答
反對 回復 2021-10-13
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

這會很丑,但你的請求中有 personId,所以你可以用你的長 personId 映射你的電影


class Movie {

    @Id Long id;

    @Column String name;

    @ManyToOne Person director;


    @Column(name="PERSON_ID")

    long personId;

}

在你的控制器中


movie.setPersonId(request.directorId);


查看完整回答
反對 回復 2021-10-13
  • 3 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號