在Hibernate中保存(持久化)父对象时如何更新(合并)子对象?

时间:2017-06-13 13:06:11

标签: hibernate hibernate-mapping cascade bidirectional-relation

我在基于Spring框架的休息Web服务中使用hibernate 4.3作为持久层。我保存父对象并更新关联的子对象时遇到了问题。 Hibernate实体和表结构如下所示。 这是我的父班。

public class Company {

@Column("name"= "id")
private int id;

@Column("name"= "name")
private String name;

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinColumn(name = "company_id")
private List<Employee> Employees = new ArrayList<>();
}

这是我的孩子班:

public class Employee {

@Column("name"= "id")
private int id;

@Column("name"= "name")
private String name;

@ManyToOne(fetch = FetchType.LAZY)
private Company company;
}

各表:

Table Company:
id
name


Table Employee
id
name
company_id

以下是我一直试图使用网络服务在我的数据库中保存的Json。

JSON:

{"id":null,
"name":"company_name",
"Employee":[
    {"id":1,
    "name":"name1"},
    {"id":2,
    "name":"name2"}
    ]
}

当我在post请求中发送上面的json时,它应该创建新的父对象并更新子对象,它还应该在子表中设置父对象id(company_id =&#39;父对象id&#39;)。但不幸的是,它对我不起作用。 当它在字段

使用CascadeType.ALL或CascadeType.PERSIST时
  

private List Employees = new ArrayList&lt;&gt;();

在我的公司实体中,它会出现错误

  

&#39;传递给分离的实体持久化&#39;

当我使用CascadeType.MERGE时,它只在子对象中设置父ID,但它不会更新子对象的任何其他字段,即&name;&#39; name&#39;柱。如果有人能帮助我,那么你的答案最受欢迎。 非常感谢你提前。

1 个答案:

答案 0 :(得分:0)

可能是您正在保存子实体的拼写错误&#34;员工&#34;但在你的comoany实体中,它被称为&#34;员工&#34;。所以它试图保存一个不存在的实体。

试试以下

{"id":null,
"name":"company_name",
"Employees":[
    {"id":1,
    "name":"name1"},
    {"id":2,
    "name":"name2"}
    ]
}