JPA - 从@ManyToMany self中删除实体

时间:2016-06-12 22:24:38

标签: java jpa persistence eclipselink jpa-2.1

我有其他文件引用的文件。我将此连接存储在实体中。

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

}

但是当我尝试删除时遇到问题。

例如:当Doc2引用Doc1时,我无法删除Doc2。

为此我必须从其他DocumentsBy 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)我也试图存储引用的文档,但这是一个死胡同。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以存储关联的反面:

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

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

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

如果您不需要基于多个...条件构建动态查询,则应避免使用条件API。 JPQL更容易编写,阅读和理解。