복붙노트

[SPRING] Spring Rest : @ManyToOne 열을 가진 행을 삽입 할 수 없음

SPRING

Spring Rest : @ManyToOne 열을 가진 행을 삽입 할 수 없음

https://spring.io/guides/gs/accessing-data-rest/에서 봄을 시작하고 있습니다.

Person 엔티티에 @ManyToOne 관계가있는 다른 엔티티 책을 추가했습니다. Person 엔티티에는 bikes라는 새 속성이 있으며 Bike 엔티티와 @OneToMany 관계가 있습니다. 시작 프로젝트와 다른 점은 getter 및 setter가있는 새로운 속성입니다.

package hello;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String firstName;
    private String lastName;

    @OneToMany
    private List<Bike> bikes;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<Bike> getBikes() {
        return bikes;
    }

    public void setBikes(List<Bike> bikes) {
        this.bikes = bikes;
    }
}

Entity Bike에 대한 설명은 다음과 같습니다.

package hello;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Bike {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name;

    @ManyToOne
    @JoinColumn(nullable = false)
    private Person person;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

PersonRepository.java가 자습서에서 변경되지 않았습니다.

package hello;

import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {

    List<Person> findByLastName(@Param("name") String name);

}

BikeRepository.java는 자전거 요청을 처리하는 새로운 저장소입니다.

package hello;

import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "bikes", path = "bikes")
public interface BikeRepository extends PagingAndSortingRepository<Bike, Long> {
    List<Bike> findByName(@Param("name") String name);
}

꽤 간단 하죠? curl을 사용하여 새로운 Person을 생성 할 수 있어야한다 (튜토리얼에서와 같이).

curl -i -X POST -H "Content-Type:application/json" -d "{  \"firstName\" : \"Frodo\",  \"lastName\" : \"Baggins\" }" http://localhost:8080/people

그리고 그것은 작동합니다 :

그러나 curl 명령으로 새로운 자전거를 추가하려고 할 때 :

curl -i -X POST -H "Content-Type:application/json" -d "{  \"name\" : \"Frodos Bike\",  \"person\" : {  \"firstName\" : \"Frodo\",  \"lastName\" : \"Baggins\" } }" http://localhost:8080/bikes

다음 오류가 발생합니다.

나는 "person_id"속성을 제공하는 경우에도 같은 오류가 발생합니다.

curl -i -X POST -H "Content-Type:application/json" -d "{  \"name\" : \"Frodos Bike\",  \"person_id\" : \"1\" }" http://localhost:8080/bikes

내 질문은 : 어떻게 새로운 자전거를 추가 할 수 있습니까?

해결법

  1. ==============================

    1.BikeRepository가 {firstName : "Frodo", lastName : "Baggins"}라는 Person이 나타내는 행을 알 수있는 방법은 없습니다. BikeRepository에게 어떻게 또는 어디서 질문을 할 것인지 알려줘야합니다.

    BikeRepository가 {firstName : "Frodo", lastName : "Baggins"}라는 Person이 나타내는 행을 알 수있는 방법은 없습니다. BikeRepository에게 어떻게 또는 어디서 질문을 할 것인지 알려줘야합니다.

    시험

    curl -i -X ​​POST -H "Content-Type : application / json"-d "{\"name \ ": \ Frodos Bike \", \ "person \": "http : // localhost : 8080 / people / 1 "}"http : // localhost : 8080 / bikes

    그렇게하면 Person 엔티티에 대해 http : // localhost : 8080 / people / 1을 쿼리합니다.

    그것은 또한 매개 변수 기반 쿼리와 함께 작동합니다, 그냥 http : // localhost : 8080 / people {name} 쿼리로 대체합니까? name = 'Frodo'

    희망이 도움이됩니다!

  2. ==============================

    2.curl -i -X ​​POST -H "Content-Type : application / json"-d "{\"name \ ": \"Frodos Bike \ ", \"person \ ": \"/ people / 1 \ "로 시도하십시오. } "http : // localhost : 8080 / bikes

    curl -i -X ​​POST -H "Content-Type : application / json"-d "{\"name \ ": \"Frodos Bike \ ", \"person \ ": \"/ people / 1 \ "로 시도하십시오. } "http : // localhost : 8080 / bikes

  3. from https://stackoverflow.com/questions/42929828/spring-rest-cannot-insert-rows-that-have-manytoone-column by cc-by-sa and MIT license