我有以下设置。
@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()操作时,将删除所有子关系。
这么长的故事简短,我可以在某些情况下级联(当我有修改对象的整个图形时)而不是其他级联(当我只有一个没有孩子的新反序列化简历的简单列表时)?
答案 0 :(得分:2)
我无法做到这一点。如果将应该有子节点的Object合并到存储中但Object没有子节点,则它们将被删除。
您可以编写一个特定的UPDATE
语句来匹配该案例。根据您拥有的值的数量,您还可以从数据库中读取对象并调用所有非子设置器。