我最近开始在我的应用程序中使用 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
:
- 公开一个
@RestResource
对于Child
类 -> 创建Child
的所有实例在创建Super
的实例之前或Super2
-> 传递所有Child
的 URLSuper
有效负载中的实例或Super2
. - 传递
Child
的详细信息在Super
的有效载荷中或Super2
不暴露@RestResource
对于Child
类和CascadeType.ALL
将负责创建Child
实例。
这两种方法都有一些优点:
- 使用选项 1,我可以添加新的
Child
反对Super
或Super2
仅由POST
获取新的Child
的 url至http://<server>:<port>/super/1/children
.但是如果我使用这种方法,我肯定会失去数据库的级联功能。 - 使用选项 2,我获得了数据库的所有级联功能,但我失去了添加新
Child
的灵 active 实例。
有什么我完全错过的吗?我想要一种方法来使用数据库的级联功能,而不会失去动态添加新子级的灵 active 。
感谢您的帮助。 :)
最佳答案
第三种解决方案应该适合您:
- 在 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;
...
}
然后你就可以在 /supers
上POST了:
{
"children": [
{
"childMetadata": "inner"
}
]
}
关于spring - 使用 Spring 数据休息发布嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38570551/