JPA-从@ManyToMany-self中删除实体



我有文档,这些文档被其他文档引用。我将此连接存储在实体中。

@Entity
public class Document extends AbstractEntity {
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name = "DREF", joinColumns =
@JoinColumn(name = "DOCID", referencedColumnName="ID"), inverseJoinColumns =
@JoinColumn(name = "REFBYDOCID", referencedColumnName="ID"))
private Set<Document> referencedBy = new HashSet<Document>();
}

但当我试图删除时,我会遇到问题。

例如:当Doc1被Doc2引用时,我不能删除Doc2。

为此,我必须从其他引用的文档集中删除Doc2。但我无法从Doc2获得这些文档的参考。

1) 我试着写一个方法来获取参考资料,但我做不到

public synchronized Document getReferencedDocuments(Integer Id) {
EntityManager em = getEntityManager();
try {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Document> cq = cb.createQuery(Document.class);
Root<Document> e = cq.from(Document.class);
????
Query q = em.createQuery(cq);
return q.getResultList();
} finally {
em.close();
}
} 

2) 我也尝试过存储引用的文档,但这是一条死胡同。

我该怎么做?

您可以存储关联的反面:

@ManyToMany(mappedBy = "referencedBy")
private Set<Document> referencedDocuments = new HashSet<>();

或者,您可以编写一个查询来查找引用要删除的文档的所有文档:

select doc1 from Document doc1
join doc1.referencedBy doc2 
where doc2.id = :doc2Id

如果不需要构造基于多个…的动态查询,则应避免使用条件API。。。标准JPQL更易于编写、阅读和理解。

最新更新