[英]How to delete records in JPA @ManyToMany relationship?
我已經定義了一個單向的ManyToMany關系,如下所示:
@Entity
@Table(name = "ODE_PROCESS_INSTANCE")
Public class ProcessInstanceDAOImpl extends OpenJPADAO implements ProcessInstanceDAO {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long _instanceId;
@ManyToMany(targetEntity = PolicyAttachmentDAOImpl.class)
private Collection<PolicyAttachmentDAO> _policyAttachments = new ArrayList<PolicyAttachmentDAO>();
public ProcessInstanceDAOImpl() {
}
public Collection<PolicyAttachmentDAO> getPolicyAttachments(){
return _policyAttachments;
}
public void setPolicyAttachments(Collection<PolicyAttachmentDAO> policyAttachments){
_policyAttachments = policyAttachments;
getEM().merge(this);
getEM().flush();
}
}
@Entity
@Table(name = "ODE_POLICY_ATTACHMENT")
public class PolicyAttachmentDAOImpl extends OpenJPADAO implements PolicyAttachmentDAO{
@Id
@Column(name = "POLICYATTACHMENT_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long _attachmentId;
@Basic
@Column(name = "POLICYATTACHMENT_NAME")
private String _attachmentName;
public PolicyAttachmentDAOImpl(String policyAttachmentName) {
_attachmentName = policyAttachmentName;
}
public void deletePolicyAttachment(){
//delete policy attachment DAO
getEM().remove(this);
getEM().flush();
}
}
連接表已創建。 問題是,當我從ODE_POLICY_ATTACHMENT刪除記錄時,聯接表未更新。 我怎么解決這個問題?
這就是我添加到ta的方式
Collection<PolicyAttachmentDAO> policyAttachments = new ArrayList<PolicyAttachmentDAO>();
attachmentDAO = new PolicyAttachmentDAOImpl("attachment_1");
policyAttachments.add(attachmentDAO);
attachmentDAO = new PolicyAttachmentDAOImpl("attachment_2");
policyAttachments.add(attachmentDAO);
attachmentDAO = new PolicyAttachmentDAOImpl("attachment_3");
policyAttachments.add(attachmentDAO);
//inst is an exisiting ProcessInstanceDAOImpl
inst.setPolicyAttachments(policyAttachments);
要從“ ODE_PROCESS_INSTANCE”表中刪除記錄,我在PolicyAttachmentDAOImpl對象上調用方法deletePolicyAttachment()。
連接表是映射多對多關聯的表。 它使Hibernate知道某些附件鏈接到某個進程。 因此,如果您不希望在連接表中引用附件,則意味着您不再希望該附件鏈接到任何進程。 因此答案很簡單:找到所有在其集合中具有附件的進程,然后從其集合中刪除該附件:
process.getPolicyAttachments().remove(theAttachment);
旁注:您的命名很糟糕。 在字段前加下划線不是標准約定,它將迫使您在所有查詢中添加該前導下划線。 您擁有的不是DAO,而是實體。 DAO是用於查詢和更新數據庫的對象。 實體是DAO返回的持久對象。 而且,您不應在每次更改流程附件時進行合並和刷新。 很少有必要進行合並,幾乎不需要進行合並,並且無論如何都不應由實體來完成,因為該實體根本不應訪問EM。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.