我有以下设置。
@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 的简单列表时)?