2016-06-12 146 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更易於編寫,閱讀和理解。