第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用 Spring Data JPA 處理 POST 請求中的關(guān)系

使用 Spring Data JPA 處理 POST 請求中的關(guān)系

九州編程 2021-10-13 12:49:35
我有以下實(shí)體,CrudRepository每個實(shí)體都有一個:@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 加載導(dǎo)演,然后創(chuàng)建新電影并最后保存它。這會導(dǎo)致兩次訪問數(shù)據(jù)庫:第一次檢索導(dǎo)演,第二次保存電影。在這種情況下,這不是什么大問題,但可能存在具有很多關(guān)系的實(shí)體,這意味著可能會執(zhí)行大量查詢來實(shí)現(xiàn)單個插入。問題:我想在單個數(shù)據(jù)庫操作中保存新電影。有沒有辦法避免初始人員查詢?有沒有更好的方法來處理這樣的情況?
查看完整描述

3 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個贊

沒有辦法告訴代碼Person它需要與您的新Movie. 因此,您確實(shí)需要執(zhí)行查詢并手動進(jìn)行關(guān)聯(lián)。

只有當(dāng)您的端點(diǎn)Person在創(chuàng)建Movie. 然后您可以簡單地執(zhí)行 2 個保存操作或使用 aCascadeType=ALL進(jìn)行單個保存操作。


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

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


也許您可以為您的Directors. 例如,如果您將所有 Director 都保存在 Redis 中,則可以搜索Director與接收到的對應(yīng)directorId的然后執(zhí)行關(guān)聯(lián)。

當(dāng)然,您仍然需要進(jìn)行第二次操作,但它可能比查詢數(shù)據(jù)庫便宜得多。


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

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個贊

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


class Movie {

    @Id Long id;

    @Column String name;

    @ManyToOne Person director;


    @Column(name="PERSON_ID")

    long personId;

}

在你的控制器中


movie.setPersonId(request.directorId);


查看完整回答
反對 回復(fù) 2021-10-13
  • 3 回答
  • 0 關(guān)注
  • 203 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號