使用spring数据休息后发布嵌套对象?

Dev*_*xit 15 spring spring-data-jpa spring-data-rest spring-hateoas spring-boot

我最近开始在我的应用程序中使用spring-data-rest.我有以下JPA实体:

@Entity
public class Super {
    @Id
    private long id;

    @JoinTable
    @OneToMany(cascade = CascadeType.ALL)
    private List<Child> children;
}

-----------------------------------------

@Entity
public class Super2 {
    @Id
    private long id;

    @JoinTable
    @OneToMany(cascade = CascadeType.ALL)
    private List<Child> children;
}

-----------------------------------------

@Entity
public class Child {
    @Id
    private long id;

    @Column
    private String childMetadata;
}
Run Code Online (Sandbox Code Playgroud)

我能想到的节能的新实例的2种方法SuperSuper2:

  1. 暴露一个@RestResourcefor Childclass - > Child在创建实例之前创建所有实例SuperSuper2- > ChildSuperor的有效负载中传递所有实例的URL Super2.
  2. 传递Child有效负载中的详细信息,Super无论Super2是否@RestResourceChild类暴露,CascadeType.ALL将负责创建Child实例.

这两种方法都有一些优点:

  1. 使用选项1,我可以添加新Child对象SuperSuper2仅通过POST新的URL Child添加http://<server>:<port>/super/1/children.但是如果我使用这种方法,我肯定会失去数据库的级联功能.
  2. 使用选项2,我获得了数据库的所有级联功能,但是我放弃了添加新Child实例的灵活性.

有什么我完全错过了吗?我想要一种方法来使用数据库的级联功能,而不会失去动态添加新子项的灵活性.

感谢帮助.:)

Nic*_*las 2

第三种解决方案应该适合您:

  1. 在 Super 或 Super2 的有效负载中传递 Child 的详细信息,而不暴露Super(和 Super2)的属性“children”的@RestResource 。

您仍然可以使用/children,但您将能够使用 super 检索子级并发布它!

为此,只需更改您的 Super(和 Super2)类,如下所示:

public class Super {
    @Id
    @GeneratedValue
    private Long id;

    @JoinTable
    @OneToMany(cascade = CascadeType.ALL)
    @RestResource(exported=false)
    private List<Child> children;

    ...
}
Run Code Online (Sandbox Code Playgroud)

然后您可以发布/supers

{
    "children": [
        {
            "childMetadata": "inner"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)