2013-04-18 153 views
0

刪除同一實體我有4類實體:CtPersonaFirma,CtFirmaDocumento和CtContrato。一個人可以簽署幾份合同,一份合同可以由多人簽署。更新集合時,從其他集合

CtPersonaFirma:包含授權簽署人。

CtContrato:包含合同

CtFirmaDocumento:上面的兩個表之間的關係。

當我刪除一個人CtPersonaFirma表級聯刪除CtFirmaDocumento表,其中有引用刪除的人,但在集合ctFirmaDocumentoCollection的實體CtContrato未更新。

public class CtContrato implements Serializable { 
@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "id_contrato") 
private Integer idContrato; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ctContrato", fetch=FetchType.LAZY) 
private Collection<CtFirmaDocumento> ctFirmaDocumentoCollection; 


public class CtPersonaFirma implements Serializable { 
@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "id_persona") 
private Integer idPersona; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ctPersonaFirma") 
private Collection<CtFirmaDocumento> ctFirmaDocumentoCollection; 

public class CtFirmaDocumento implements Serializable { 
@EmbeddedId 
protected CtFirmaDocumentoPK ctFirmaDocumentoPK; 
@JoinColumn(name = "id_persona_ref", referencedColumnName = "id_persona", insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private CtPersonaFirma ctPersonaFirma; 
@JoinColumn(name = "id_contrato", referencedColumnName = "id_contrato", insertable = false, updatable = false) 
@ManyToOne(optional = false) 
private CtContrato ctContrato; 

回答

0

JPA要求應用程序保持雙向關係的雙方。當您對一方進行更改時,JPA不會爲您維護另一方,並且您的緩存實體將與數據庫中的內容不同步。根據您更改哪一方,這些更改可能不會保留在數據庫中。

在這種情況下,當您刪除CtFirmaDocumento對象,你也應該刪除所有引用到任何CtContrato可能會引用它的對象。

在這種情況下,替代方法是在刷新或提交更改後強制刷新任何CtContrato對象,但通常更好的方法是直接修復引用以避免以後出現此關係問題。

+0

強制刷新,可以得到什麼樣的問題呢? – meyquel

+0

這是一個數據庫訪問權限,因此它具有性能成本。刷新與未提交更改的實體將恢復這些變化,這就是爲什麼我認爲這是更容易維護雙方,或者只是不映射1:在所有的M。 – Chris

+0

我明白了,謝謝你這麼多... – meyquel