簡體   English   中英

如何刪除JPA @ManyToMany關系中的記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM