2016-08-20 2 views
3

액터와 동영상의 두 엔티티가 있습니다. 이 두 개체 사이에는 ManyToMany 관계가 있습니다 (Actor는 둘 이상의 Movie에 참여할 수 있고 Movie에서는 둘 이상의 Actor를 볼 수 있기 때문에). 내 Spring Data Rest API에는 다음과 같은 끝 점이 있습니다.스프링 데이터 나머지 ManyToMany 관계로 새 항목 게시

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

이제 영화 페이지에서 새 액터를 만들겠습니까? 내 고객은 배우 정보와 영화와의 관계가 포함 된 (단일) POST 요청을 제출합니다. 나는 다음 (ID 1 영화에 대한 새로운 배우)와 같은 뭔가 시도 :

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

봄 API가 만든 (201)로 응답, 그래서 형식과 영화 URI는 정상입니다. 액터에 대해 API 또는 DB를 쿼리 할 때 액터가 생성되었지만 관계가 존재하지 않음을 발견했습니다.

Spring 데이터 나머지가있는 ManyToMany 관계에 대해 두 가지 요청 (액터를 만들려면 하나는 관계를 만들려면 하나)을해야한다는 것을 이미 알고 있습니다. 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> { 
} 

UPDATE

JPA에서 ManyToMany 관계를 처리하는 방식으로 인해 문제가 발생했습니다. 이 thread에는 JPA 및 REST와의 양방향 연관을 처리하는 방법에 대한 영리한 설명이 있습니다.

나는이 두 가지 옵션 중 하나를 사용하여 내 문제를 해결할 수

:

- 두 POST 요청의

에 새로운 배우를 유지하는

http://host:port/actors 

에, 하나를 수행

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

새 액터와 동영상 간의 연결을 유지합니다.

B -

http://host:port/actors 

에 하나 개의 POST 요청을하는 (내가 질문의 시작 부분에 설명 된대로)하지만 액터 클래스의 setMovies 방법을 수정 (I 인용 스레드에 설명 된대로) .

+0

관련 영화를 게시하는 이상한 방법입니다. 나머지 컨트롤러의 메서드 메서드는 어떻게 생겼습니까? – ChiefTwoPencils

+0

관련 동영상을 하나만 올리겠습니다. 영화 페이지에서는보고있는 영화에 배우를 추가 할 수 있으므로 한 가지 요청 만하는 것이 가장 좋은 방법이라고 생각했습니다. 두 가지 요청 (새 액터에 대한 요청과 무비와 액터 간의 새로운 관계에 대한 요청)을 보낼지 더 나은 선택이 될 것입니다. – Francesco

+0

답변이없는 좋은 질문 :/ – EralpB

답변

-1

많은 경우, 두 테이블 사이에있는 테이블과 액터와 무비 테이블 모두가 필요합니다.

테이블 구조는 다음과 같습니까? 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/

+1

좋아,하지만 요점이 아니야. 스프링 데이터 (Hibernate가 솔직히 말해서)는 n-n 관계를 처리하기 위해 자동으로 조인 테이블을 자동으로 생성합니다. 내 질문은 : 첨부 된 JSON 요청이 새로운 Actor를 만들고 Actor와 Movie 사이의 관계를 생성하지 않는 이유는 무엇입니까? 요청 형식에 실수를 했습니까? 나는 그렇지 않다고 생각한다. 그렇지 않으면 나는 400 개의 나쁜 요청 응답을 취했을 것이다. 그래서, 나는 두 명의 요청을해야합니까? 하나는 새로운 Actor를위한 것이고 다른 하나는 관계를위한 것입니까? – Francesco

1

우선 자원을 작성합니다 이 만든 배우 자원 :

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 

가 마침내 연결을 생성 (디카프리오 URI http://host:port/actors/1됩니다 랬) :

별도의 줄에 영화의 URI에 각을 포함 movies.txt와

:

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

이 내용을 유용하게 사용하십시오. link

+0

Curl은 명령 줄입니다 (일반적으로). 봄이 요청되었습니다. – Gibolt

관련 문제