簡體   English   中英

Spring數據休息POSTT與ManyToMany關系的新項目

[英]Spring data rest POSTing a new item with ManyToMany relationship

我有兩個實體:演員和電影。 在這兩者之間存在一個ManyToMany關系(因為和Actor可以連接多個Movie,而在Movie中你可以看到多個Actor)。 在我的Spring Data Rest API上,我有以下端點:

http://host:port/movies
http://host:port/actors

現在假設我將從電影頁面創建一個新的actor。 我的客戶端將提交一個(單個)POST請求,其中包含演員信息以及與電影的關系。 我嘗試了類似下面的內容(id為1的電影的新演員):

{ 
  "name": "Leonardo Di Caprio",
  "movies": [ "http://host:port/movies/1" ]
}

Spring API回復201 Created,因此格式和電影URI都很好。 當我為actor查詢API或DB時,我發現已經創建了actor,但關系不存在。

我已經知道你應該為SpringTamMany與Spring數據休息的關系做兩個請求(一個用於創建actor,一個用於創建關系)。 我在這里問是否有辦法用單個請求創建兩者(比如OneToMany / ManyToOne或OneToOne關系)。

演員班

@Entity
public class Actor {

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

    private String name;

    @ManyToMany(mappedBy = "actors")
    private List<Movie> movies;

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Movie> getMovies() {
        return movies;
    }

    public void setMovies(List<Movie> movies) {
        this.movies = movies;
    }
}

電影課

@Entity
public class Movie {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long id;

    protected String title;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    protected List<Actor> actors;

    public long getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<Actor> getActors() {
        return actors;
    }

    public void setActors(List<Actor> actors) {
        this.actors = actors;
    }

}

對於這兩個實體,我有標准存儲庫:

@Repository
public interface ActorRepository extends PagingAndSortingRepository<Actor, Long> {
}

UPDATE

我面臨的行為是由於JPA如何處理ManyToMany關系。 在這個主題中,有一個關於如何處理與JPA和REST的雙向關聯的聰明解釋。

我可以用以下兩個選項之一解決我的問題:

A - 執行兩個POST請求,一個打開

http://host:port/actors 

堅持新的演員和一個人

http://host:port/movies/{id}/actors 

如下:

...                                              |
Content-Type: text/uri-list                      | headers
...                                              |

http://host:port/actors/{id-of-the-new-actor}    | body

堅持新演員和電影之間的聯系。

B - 僅執行一個POST請求

http://host:port/actors 

(正如我在問題開頭所描述的那樣)但修改了Actor類中的setMovies方法(如我引用的主題中所述)。

首先創建資源:創建actor資源:

curl -i -X POST -H "Content-Type:application/json"
    -d "{\"name\":\"Leonardo Di Caprio\"}" http://host:port/actors

然后制作電影:

curl -i -X POST -H "Content-Type:application/json"
  -d "{\"title\":\"Titanic\"}" http://host:port/movies

最終創建關聯(假設http:// host:port / actors / 1是dicaprio uri):

curl -i -X PUT -H "Content-Type:text/uri-list"
  --data-binary @movies.txt http://host:port/actors/1/movies

包含電影的uris的movies.txt,每個都在一個單獨的行上:

http://host:por/movies/1
http://host:por/movies/2

按照這個有用的鏈接

對於多對多,您需要一個位於Actor和Movies表之間的表,其id為兩者。

表結構可能如下所示? CREATE TABLE `ActorMovies` ( `actorId` INT NOT NULL, `movieId` INT NOT NULL, PRIMARY KEY (`ActorId`, `MoviesId`));

然后表的連接看起來像這樣

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "ActorMovies", joinColumns = {
    @JoinColumn(name = "movieId", nullable = false, updatable = false) },inverseJoinColumns = { @JoinColumn(name = "actorId",nullable = false, updatable = false) })
    public Set<Category> getActors() {
        return this.actors;
    }

許多代碼示例

https://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM