2013-04-18 56 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