我有下面的模型:一篇文章可以有一些标签,一些文章可以有一个标签。
所以它是一个多对多的关系,有 3 个表:
当我删除标签时,我想删除:
但我当然不想删除ARTICLE中的文章。
我怎样才能做到这一点 ?
我试试这个,但它不起作用:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
for (Article article : tagToDelete.getArticles()) {
article.getTags().remove(tagToDelete);
}
session.delete(tagToDelete);
谢谢 !
@Entity
@Table(name="ARTICLE")
public class Article extends AbstractAuditedEntity {
@Id
@Column(name="ID", nullable=false)
private Long id;
@ManyToMany
@JoinTable(name="ARTICLE_TAG", joinColumns=@JoinColumn(name = "ARTICLE_ID"), inverseJoinColumns=@JoinColumn(name = "TAG_ID"))
private Set<Tag> tags = new HashSet<>();
public Article() {}
/** Getters & Setters */
}
@Entity
@Table(name="TAG")
public class Tag {
@Id
@Column(name="ID", nullable=false)
private Long id;
@ManyToMany(mappedBy="tags")
private Set<Article> articles = new HashSet<>();
public Tag() {}
/** Getters & Setters */
}
最佳答案
找到了解决办法。在删除时,我们需要确保不要将删除级联到文章,反之亦然。
@ManyToMany(cascade={PERSIST, DETACH})
@JoinTable(name="ARTICLE_TAG",
joinColumns=@JoinColumn(name = "ARTICLE_ID"),
inverseJoinColumns=@JoinColumn(name = "TAG_ID"))
private Set<Tag> tags = new HashSet<>();
我的问题是使用
CascadeType.All
,默认情况下包括 CascadeType.REMOVE
,这会将文章的删除级联到它包含的标签。您也可以添加
cascade={PERSIST, DETACH}
到您的标签实体以防止删除标签以删除其关联的文章。
关于hibernate - 如何使用JPA删除连接表中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235303/