0

我有以下设置。

@Table(name = "CV", schema = "recruiter")
public class CV extends AuditedEntity {
    ....
@OneToMany(cascade = { CascadeType.ALL})
private Set<Experience> experiences;

@OneToMany(cascade = { CascadeType.ALL})
private Set<Education> educations;

@OneToMany(cascade = { CascadeType.ALL})
private Set<Certification> certifications;
 ....
}

如您所见,我只希望级联所有操作。选择表中的所有 CV 后,我将集合传递给将实体序列化为 JSON 的上层。用户将按照他认为合适的方式修改实体值和子值。

当实体返回时,它将从 JSON 反序列化并合并回会话中:

// cv is the deserialization of [{"id":1,"creationDate":1368230400000,"creationUser" ... along with all child entities ( educations, experiences and certifications )
em.merge(cv); 

现在,通常 JPA(Hibernate) 只会保留用户更改的内容,所以我们在这一点上很好。但是如果最初序列化的 CV 不包含任何子属性会发生什么?如果它只是这个 JPA 查询的结果怎么办:

em.em.createNamedQuery("Select cv from CV"); // no eager loading no nothing. 

在这种情况下,不会填充 CV 的所有子项(经验、教育、证书)。执行 merge() 操作时,所有子关系都将被删除。

长话短说,我可以在某些情况下级联(当我拥有修改对象的整个图表时)而不在其他情况下级联(当我只有一个没有孩子的新反序列化 CV 的简单列表时)?

4

1 回答 1

2

据我所知,没有办法做到这一点。如果您将一个应该有子对象的对象合并到存储中,但该对象没有子对象,那么它们将被删除。

您可以编写一个特定的UPDATE语句来匹配这种情况。根据您拥有的值的数量,您还可以从数据库中读取对象并调用所有非子设置器。

于 2013-05-11T18:07:59.883 回答