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

标签 spring spring-boot spring-data-jpa spring-data-rest spring-hateoas

我最近开始在我的应用程序中使用 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;
}

我可以想到两种保存 Super 新实例的方法或 Super2 :

  1. 公开一个@RestResource对于 Child类 -> 创建 Child 的所有实例在创建 Super 的实例之前或 Super2 -> 传递所有 Child 的 URL Super 有效负载中的实例或 Super2 .
  2. 传递Child的详细信息在 Super 的有效载荷中或 Super2不暴露@RestResource对于 Child类和 CascadeType.ALL将负责创建 Child实例。

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

  1. 使用选项 1,我可以添加新的 Child反对SuperSuper2仅由 POST获取新的 Child 的 url至http://<server>:<port>/super/1/children .但是如果我使用这种方法,我肯定会失去数据库的级联功能。
  2. 使用选项 2,我获得了数据库的所有级联功能,但我失去了添加新 Child 的灵 active 实例。

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

感谢您的帮助。 :)

最佳答案

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

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

您仍然可以使用 /children,但您可以使用 super 检索 child 并发布它!

为此,只需像这样更改您的 Super(和 Super2)类:

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

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

    ...
}

然后你就可以在 /supersPOST了:

{
    "children": [
        {
            "childMetadata": "inner"
        }
    ]
}

关于spring - 使用 Spring 数据休息发布嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38570551/

相关文章:

java - 如何在 Spring 中将一些文本添加到所有 Controller URL

java - 如何根据 Spring JPA 中的参数使用计算字段发出分页动态请求

java - Spring Controller : Validation failed for object ='invoiceData' . 错误计数:4

保存 JPA 实体时出现 java.lang.StackOverflowError

java - Hibernate更新实体最佳实践

spring - Spring 中的事务和流

Spring @Autowired 对象为空

java - Spring中的@Autowired注释给我NullPointerException

java - 自动连线注释在自定义推土机转换器内不起作用

java - 为什么实体不会自动生成数据库表