java – Spring数据休息使用ManyToMany关系POST一个新项目
我有两个实体:演员和电影.在这两者之间存在一个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关系.在这个thread中,有一个关于如何处理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 按照这个有用的link (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |