如何在spring mvc中保存嵌套json对象
我试图通过RESTFUl服务以嵌套关系的形式保存2个对象。即,一个办公室有2名员工 但是,正如您从下面的示例中看到的,如果不先保存office,我将无法知道officecode为20。没有: “办公代码”:“20” 尽管json对象是嵌套的,但是我保存了employees和Office OK,但它们彼此没有关联 如何在1提交中保存嵌套对象 实体看起来像:如何在spring mvc中保存嵌套json对象,json,spring,model-view-controller,nested,Json,Spring,Model View Controller,Nested,我试图通过RESTFUl服务以嵌套关系的形式保存2个对象。即,一个办公室有2名员工 但是,正如您从下面的示例中看到的,如果不先保存office,我将无法知道officecode为20。没有: “办公代码”:“20” 尽管json对象是嵌套的,但是我保存了employees和Office OK,但它们彼此没有关联 如何在1提交中保存嵌套对象 实体看起来像: // Property accessors @Id @Column(name = "OFFICECODE", uniq
// Property accessors
@Id
@Column(name = "OFFICECODE", unique = true, nullable = false, length = 10)
public String getOfficecode() {
return this.officecode;
}
....
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "office")
public Set<Employee> getEmployees() {
return this.employees;
}
以下是我发布的JSON对象:
{
"state":"CA",
"country":"USA",
"officecode":"20",
"city":"Vancouver",
"phone":"+1 650 219 4782",
"addressline1":"100 Market Street",
"addressline2":"Suite 300",
"postalcode":"94080",
"territory":"NA",
"employees":[
{
"extension":"x5800",
"employeenumber":2001,
"lastname":"joe",
"firstname":"joe",
"email":"joe@classicmodelcars.com",
"reportsto":null,
"jobtitle":"President",
"pay":null,
"officecode":"20"
},
{
"extension":"x5800",
"employeenumber":2002,
"lastname":"mary",
"firstname":"mary",
"email":"mary@classicmodelcars.com",
"reportsto":null,
"jobtitle":"Vice President",
"pay":null
"officecode":"20"
}
]
}
好的,您正在使用Cascade,但它仍然不起作用。这是因为员工被添加到办公室的方式 JSON解组器将员工关联为:
office.getEmployees().add(employee)
这不足以将员工链接到办公室,因为office.getEmployees是关系的非拥有方,Hibernate不会跟踪它
结果是office和employee都被插入,但employee到office的外键为null
要解决此问题,在保存之前,您需要将所有员工链接到office,方法是将此方法添加到office并在“持久化”之前调用它:
public void linkEmployees() {
for (Employee employee : employees) {
employee.setOffice(this);
}
}
这样就设置了关系的拥有方(Employee.office),因此Hibernate将收到新关联的通知,并通过在Employee和office之间填充外键字段来持久化它
如果您想了解更多关于Hibernate双向关系和对拥有方的局部需求的信息,请参阅中我的答案。奇怪,我的@OneToMany位于不同的位置,我已更新了问题以反映这一点。Thx.我在这个线程上更新了关于拥有方的答案,以及为什么使用空外键保存员工的行为是正常的,以及如何处理。我更新了答案,请参阅下面的“如何将外键从员工表填充到办公室表”。你尝试过了吗?
public void linkEmployees() {
for (Employee employee : employees) {
employee.setOffice(this);
}
}