【问题标题】:JPA programmatically define cascading optionsJPA 以编程方式定义级联选项
【发布时间】:2013-05-11 17:30:27
【问题描述】:

我有以下设置。

@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 的简单列表时)?

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 2010-09-28
      • 2014-02-23
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      相关资源
      最近更新 更多