【问题标题】:How to delete records in JPA @ManyToMany relationship?如何删除 JPA @ManyToMany 关系中的记录?
【发布时间】:2014-03-04 11:35:51
【问题描述】:

我已经定义了这样的单向多对多关系:

@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()。

【问题讨论】:

  • 你确定table没有更新或者对象之间的runtime relationships?因为在 JPA 中,程序员负责管理实体的runtime relationships。这会很有帮助:blog.xebia.com/2009/03/16/…

标签: java sql jpa many-to-many openjpa


【解决方案1】:

连接表用于映射多对多关联。这就是让 Hibernate 知道某些附件与某些进程相关联的原因。因此,如果您不想在连接表中引用附件,这意味着您不再希望附件链接到任何流程。所以答案很简单:找到所有在其集合中包含附件的进程,然后从其集合中删除该附件:

process.getPolicyAttachments().remove(theAttachment);

旁注:您的命名很糟糕。为字段添加下划线不是标准约定,并且会强制您在所有查询中添加此前导下划线。你所拥有的不是 DAO,而是实体。 DAO 是用于查询和更新数据库的对象。实体是 DAO 返回的持久对象。并且您不应该在每次更改进程的附件时合并和刷新。很少需要合并,几乎不需要刷新,而且这不应该由实体完成,它根本不应该访问 EM。

【讨论】:

  • 我是初学者。如果我使用 OpenJPA 而不是 Hibernate,您写的内容是否有效?当我更改流程实例的附件时,我应该使用“合并”和“刷新”的 insted 什么?我之所以这样做是因为我从这里 blog.jbaysolutions.com/2012/12/17/… 放弃了这个例子
  • JPA 就是 JPA。是的,它是有效的。你不应该使用任何东西。合并用于将分离实体的状态复制到附加实体。这不是这里的情况。 flush() 用于强制 JPA 引擎立即执行其所有插入、更新和删除查询,而不是等到它在必要时自动执行。
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2016-09-08
相关资源
最近更新 更多