JPA以编程方式定义级联选项



我有以下设置。

@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;
 ....
}

因此,正如您所看到的,我只希望所有操作被级联。在选择表中的所有CVs之后,我将集合传递给上层,上层将实体序列化为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列表,没有孩子)吗?

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

您可以编写一个特定的UPDATE语句来匹配这种情况。根据有多少值,还可以从DB中读取对象并调用所有非子对象setter。

最新更新