我遇到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;
}
}
答案 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文档:
关联可能是双向的。在双向关系中,一方(并且只有一方)必须是所有者:所有者负责关联列更新。要声明一方不对关系负责,使用属性mappedBy。 mappedBy引用所有者方的关联的属性名称。在我们的例子中,这是护照。如您所见,您不必(必须)声明连接列,因为它已在业主方面声明。