JPA - 从@ManyToMany self 中删除实体

JPA - Delete entities from @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。

为此,我必须从其他 Documents referencedBy Sets 中删除 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 更容易编写、阅读和理解。