【问题标题】:Spring Data Rest - can only create nested entities on one directionSpring Data Rest - 只能在一个方向上创建嵌套实体
【发布时间】:2017-08-26 23:19:43
【问题描述】:

我对 Spring Boot / Spring Data 有疑问,我只能在一个方向上创建嵌套实体。

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

如果我创建一个孩子,通过这样做:

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;
    }
}

【问题讨论】:

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


【解决方案1】:

在您的示例中,孩子是关系芯片的所有者(它保存在数据库的子表中)。我认为有问题。 Spring Data Rest 将子对象加载到“子”字段中,但不知道它也应该更改子对象的“父”字段。 (另见https://stackoverflow.com/a/1796501/7226417)。

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

【讨论】:

  • 嘿 Benkuly,感谢您的回答,我忽略了 vhild 是关系所有者的事实。这就解释了正在发生的事情。感谢您的帮助。
【解决方案2】:

请参阅上面 Benkuly 的回复,基本上,一个关联必须有一个所有者,它必须存在才能存在任何关系。请参阅 Hibernate 文档:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 2020-08-08
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多