gpt4 book ai didi

java - Spring data rest 发布具有多对多关系的新项目

转载 作者:搜寻专家 更新时间:2023-11-01 03:56:32 24 4
gpt4 key购买 nike

我有两个实体: Actor 和电影。这两者之间存在多对多关系(因为 Actor 可以加入多个 Movie 并且在一个 Movie 中您可以看到多个 Actor)。在我的 Spring Data Rest API 上,我有以下端点:

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

现在假设我要从电影页面创建一个新 Actor 。我的客户将提交一个(单个)POST 请求,其中包含 Actor 信息以及与电影的关系。我尝试了类似下面的内容(id 为 1 的电影的新 Actor ):

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

Spring API 回复 201 Created,因此格式和电影 URI 没问题。当我查询 API 或 DB 中的 actor 时,我发现 actor 已创建但关系不存在。

我已经知道您应该为与 Spring 数据 rest 的多对多关系发出两个请求(一个创建参与者,一个创建关系)。我在这里问是否有一种方法可以通过单个请求创建两者(例如 OneToMany/ManyToOne 或 OneToOne 关系。

Actor 类

@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> {
}

更新

我遇到的行为是由于 JPA 处理多对多关系的方式所致。在这个thread关于如何处理与 JPA 和 REST 的双向关联有一个巧妙的解释。

我可以使用以下两个选项之一解决我的问题:

A - 执行两个 POST 请求,一个在

http://host:port/actors 

将新的 Actor 和一个保存在

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

如下:

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

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

保持新 Actor 与电影之间的关联。

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

movies.txt 包含电影的 uris,每个都在一个单独的行上:

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

关注这个有用的link

关于java - Spring data rest 发布具有多对多关系的新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39057338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com