如何删除 JPA @ManyToMany 关系中的记录?

Posted

技术标签:

【中文标题】如何删除 JPA @ManyToMany 关系中的记录?【英文标题】:How to delete records in JPA @ManyToMany relationship? 【发布时间】: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/… 【参考方案1】:

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

process.getPolicyAttachments().remove(theAttachment);

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

【讨论】:

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

以上是关于如何删除 JPA @ManyToMany 关系中的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin 中使用 JPA ManyToMany 双向关系

使用JPA和Hibernate提供程序的ManyToMany关系不会创建主键

spring jpa ManyToMany 理解和使用

如何在 Nest.js 中删除 @ManyToMany 关系中的数据

使用连接表存储库的@manytomany 中的 Spring 数据 jpa 规范和可分页

Spring-Data-JPA ManyToMany 与额外列的关系