加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Spring数据休息使用ManyToMany关系POST一个新项目

发布时间:2020-12-15 02:16:14 所属栏目:Java 来源:网络整理
导读:我有两个实体:演员和电影.在这两者之间存在一个ManyToMany关系(因为和Actor可以连接多个Movie,而在Movie中你可以看到多个Actor).在我的 Spring Data Rest API上,我有以下端点: http://host:port/movieshttp://host:port/actors 现在假设我将从电影页面创建
我有两个实体:演员和电影.在这两者之间存在一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读