如何删除 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关系不会创建主键
如何在 Nest.js 中删除 @ManyToMany 关系中的数据