2 回答
TA贡献1847条经验 获得超7个赞
使用此设置应该会产生想要的结果
class Article {
...
@ManyToMany
@JoinTable(...)
private Set<Tag> tags = new HashSet<>();
}
class Tag {
...
@ManyToMany(mappedBy = "tags")
private Set<Article> articles = new HashSet<>();
}
该Article实体正在取得该关系的所有权。
老答案。
当从public Set<Tag> tags(ARTICLE 类的列表)中删除标签时,TAGS_ARTICLES 中的相应行也会被删除,但不会删除 TAG 表中的标签。
据我所知,孤立的记录不会被删除。你想删除它们。这个对吗?
您可能想尝试使用 Hibernate 特定的@Cascade注释(文档)。
只需注释您的Collection<T>字段。
@ManyToMany(...)
@Cascade(CascadeType.REMOVE) // or CascadeType.DELETE
private Set<Tag> tags = new HashSet<>();
请务必将其包含在org.hibernate.annotations包装中。
TA贡献1827条经验 获得超8个赞
实体操作的行为取决于关系的所有权,这取决于您将mappedBy属性放置到注释的位置。拥有的实体mappedBy是不是所有者的实体。关系的双方都不能是所有者。
在这里,您需要确定正确的所有者。假设标签是所有者。然后在删除标签时,关系 TAGS_ARTICLES 将自动更新。删除 TAGS_ARTICLES 时,您必须自己删除关系。
@Entity
public class Tag{
@ManyToMany
Set<Tag_Articles> articles;
//...
}
@Entity
public class Tag_Articles{
@ManyToMany(mappedBy="articles")
Set<Tag> tags;
//...
}
对于像上面这样的实体关系,你可以尝试这样的 -
entityManager.remove(articles)
for (Tag tag: articles.tags) {
tag.articiles.remove(articles);
}
添加回答
举报