Spring Data Rest - 只能在一个方向上创建嵌套实体

时间:2017-04-01 20:41:31

标签: spring-boot spring-data spring-data-rest

我遇到Spring Boot / Spring Data的问题,我只能在一个方向上创建嵌套实体。

我有两个实体,Parent和Child,而Parent与Child实体有OnetoMany关系。

如果我创建一个Child,请执行以下操作:

POST http://localhost:8080/children
{
    "name": "Tenzin"
}

然后通过执行以下操作创建父:

POST http://localhost:8080/parents
{
    "name": "Fred and Alma",
    "children": [ "http://localhost:8080/children/1" ]
}

它没有用。

然而,如果我先创建父级,然后通过执行此操作创建一个新子级,它确实有效:

POST http://localhost:8080/children
{
    "name": "Jacob",
    "parent": [ "http://localhost:8080/parents/1" ]
}

为什么会出现这种情况,这是预期的行为,还是我做错了什么?

是因为Parent实体(见下文)在children属性上有cascade = ALL吗?

父实体:

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
    private List<Child> children = new ArrayList<>();

    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public List<Child> getChildren() {
        return children;
    }

    public void setChildren(List<Child> children) {
        this.children = children;
    }

    public String getName() {
        return name;
    }

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

子实体:

@Entity
public class Child {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne
    private Parent parent;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }

    public String getName() {
        return name;
    }

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

2 个答案:

答案 0 :(得分:1)

在您的示例中,子项是relationchip的所有者(它保存在数据库的子表中)。我认为有问题。 Spring Data Rest将子对象加载到&#34; children&#34;字段,但不知道它也应该改变父母&#34;儿童对象的领域。 (另见https://stackoverflow.com/a/1796501/7226417)。

您可以通过捕获Spring Data Rest事件(http://docs.spring.io/spring-data/rest/docs/current/reference/html/#events)并手动设置&#34; parent&#34;来解决此问题。字段。

答案 1 :(得分:0)

参见上面的Benkuly的回应,基本上,一个协会必须拥有一个所有者,必须存在才能存在任何关系。请参阅Hibernate文档:

https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-mapping-association

  

关联可能是双向的。在双向关系中,一方(并且只有一方)必须是所有者:所有者负责关联列更新。要声明一方不对关系负责,使用属性mappedBy。 mappedBy引用所有者方的关联的属性名称。在我们的例子中,这是护照。如您所见,您不必(必须)声明连接列,因为它已在业主方面声明。