Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在spring mvc中保存嵌套json对象_Json_Spring_Model View Controller_Nested - Fatal编程技术网

如何在spring mvc中保存嵌套json对象

如何在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

我试图通过RESTFUl服务以嵌套关系的形式保存2个对象。即,一个办公室有2名员工

但是,正如您从下面的示例中看到的,如果不先保存office,我将无法知道officecode为20。没有:

“办公代码”:“20”

尽管json对象是嵌套的,但是我保存了employees和Office OK,但它们彼此没有关联

如何在1提交中保存嵌套对象

实体看起来像:

    // 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);
    }
}