2016-06-12 93 views
0

我拥有其他文档引用的文档。我将这个连接存储在实体中。JPA - 从@ManyToMany自身删除实体

@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。

为此,我必须从其他文档referencedBy集中移除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

您可以存储关联的反向侧:

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

或者你可以编写一个查询来发现所有的文件引用的文件删除:

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

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