[英]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.