我有其他文件引用的文件。我将此连接存储在实体中。
@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)我也试图存储引用的文档,但这是一个死胡同。
我该怎么做?
答案 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更容易编写,阅读和理解。