Spring Rest:无法插入具有@manytone列的行

Spring Rest:无法插入具有@manytone列的行,spring,spring-mvc,http-post,spring-data-rest,spring-hateoas,Spring,Spring Mvc,Http Post,Spring Data Rest,Spring Hateoas,我正在学习一个关于spring入门的教程 我添加了另一个实体书籍,它与个人实体有@manytone关系。 Person实体有一个名为bikes的新属性,并且与Bike实体有@OneToMany关系。与getting started项目唯一不同的是带有getter和setter的新属性: package hello; import java.util.List; import javax.persistence.Entity; import javax.persistence.Generate

我正在学习一个关于spring入门的教程

我添加了另一个实体书籍,它与个人实体有@manytone关系。 Person实体有一个名为bikes的新属性,并且与Bike实体有@OneToMany关系。与getting started项目唯一不同的是带有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;
    }
}
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);

}
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

我的问题是:如何添加一辆新自行车?

尝试使用
curl-I-X POST-H“内容类型:应用程序/json”-d“{\'name\:\'Frodos Bike\”,\'person\:\“/people/1\”)http://localhost:8080/bikes

尝试使用
curl-i-X POST-H“内容类型:application/json”-d“{”name\:“Frodos Bike\”,“person\:\”/人/1\“}”http://localhost:8080/bikes

您的自行车管理员无法知道
行的
代表人:{firstName:“Frodo”,lastName:“Baggins”}
。你必须告诉你的自行车经销商如何或在哪里查询

试一试

curl-i-xpost-H“内容类型:application/json”-d“{”name\:\Frodos Bike\,“person\:”http://localhost:8080/people/1" }" http://localhost:8080/bikes

该like将查询
http://localhost:8080/people/1
用于
个人实体

它还可以用于基于参数的查询,只需将
{id}
查询替换为
http://localhost:8080/people?name=“弗罗多”


希望这能有所帮助!

您的BikeRepository无法知道
人所代表的
:{firstName:“Frodo”,lastName:“Baggins”}
。您必须告诉您的BikeRepository如何或在哪里查询该行

试一试

curl-i-xpost-H“内容类型:application/json”-d“{”name\:\Frodos Bike\,“person\:”http://localhost:8080/people/1" }" http://localhost:8080/bikes

该like将查询
http://localhost:8080/people/1
用于
个人实体

它还可以用于基于参数的查询,只需将
{id}
查询替换为
http://localhost:8080/people?name=“弗罗多”


希望有帮助

谢谢你:D。我不知道这段时间里我怎么没有想到这个组合……你会如何更新person\u id列上的bike字段。我尝试了
curl-I-X PUT-H“Content Type:application/json”-D“{”name\:“Frodos bike\”,“person\:”http://localhost:8080/people/2\" }" http://localhost:8080/bikes/1
但它不起作用。PS有一个ID为2的人。为什么
PUT
不起作用我不知道,我还没有找到答案。但是,如果您使用
补丁
,它会起作用。这也是更新对象的更好选择,因为您只传输要更新的这些部分<代码>放置
总是想要整个对象。。。(顺便说一下
http://localhost:8080
不需要)
PUT
将与
curl-i-X PUT-H“内容类型:应用程序/json”-d'{u链接:{“个人”:{“href”:“/people/2”} http://localhost:8080/bikes/1/person
谢谢你:D.我不知道这段时间我怎么没有想到这个组合……你会如何更新person\u id列上的bike字段。我尝试了
curl-I-X PUT-H“内容类型:application/json”-D“{”name\:“Frodos bike\”,“person\:”http://localhost:8080/people/2\" }" http://localhost:8080/bikes/1
但它不起作用。PS有一个ID为2的人。为什么
PUT
不起作用我不知道,我还没有找到答案。但是,如果您使用
补丁
,它会起作用。这也是更新对象的更好选择,因为您只传输要更新的这些部分<代码>放置总是想要整个对象。。。(顺便说一下
http://localhost:8080
不需要)
PUT
将与
curl-i-X PUT-H“内容类型:应用程序/json”-d'{u链接:{“个人”:{“href”:“/people/2”}http://localhost:8080/bikes/1/person
curl -i -X POST -H "Content-Type:application/json" -d "{  \"name\" : \"Frodos Bike\",  \"person\" : {  \"firstName\" : \"Frodo\",  \"lastName\" : \"Baggins\" } }" http://localhost:8080/bikes
curl -i -X POST -H "Content-Type:application/json" -d "{  \"name\" : \"Frodos Bike\",  \"person_id\" : \"1\" }" http://localhost:8080/bikes