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 更容易编写、阅读和理解。
我有被其他文件引用的文件。我将此连接存储在实体中。
@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 更容易编写、阅读和理解。