2013-05-11 53 views
0

我有以下設置。JPA programmaticaly定義級聯選項

@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(休眠)將只能堅持什麼,用戶已經改變,所以我們很好在這一點上。但是如果最初序列化的CV不包含任何子屬性會發生什麼?如果是這樣的JPA查詢的只是結果:

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

在這種情況下,CV(經驗,教育,認證)的所有兒童將不會被填充。在執行merge()操作時,所有的子關係都將被刪除。我可以在某些情況下級聯(當我具有修改對象的整個圖形),而不是在其他級聯級聯(當我剛剛有一個沒有孩子的新近反序列化CV簡單列表)時,可以級聯嗎?

回答

2

我不知道要這樣做。如果您將一個應該有子項的對象合併到存儲中,但該對象沒有子項,則它們將被刪除。

你可以寫一個特定的UPDATE聲明來匹配這種情況。根據您擁有多少個值,您還可以從數據庫中讀取對象並調用所有非子設置器。