java – Spring数据休息使用ManyToMany关系POST一个新项目
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring数据休息使用ManyToMany关系POST一个新项目,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2953字,纯文字阅读大概需要5分钟。
内容图文
![java – Spring数据休息使用ManyToMany关系POST一个新项目](/upload/InfoBanner/zyjiaocheng/767/6f54acfd586344fe96464e0ae83a9d5e.jpg)
我有两个实体:演员和电影.在这两者之间存在一个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
内容总结
以上是互联网集市为您收集整理的java – Spring数据休息使用ManyToMany关系POST一个新项目全部内容,希望文章能够帮你解决java – Spring数据休息使用ManyToMany关系POST一个新项目所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。