如何使用JPA删除连接表中的行

2023-11-24

我有以下模型:一篇文章可以有一些标签,并且一些文章上可以有一个标签。 所以它是与 3 个表的多对多关系:

  • ARTICLE
  • ARTICLE_TAG
  • TAG

当我删除标签时,我想删除:

  • TAG 中的标签
  • 该标签与 ARTICLE_TAG 中标记的文章之间的所有关系

但我当然不想删除ARTICLE中的文章。

我怎样才能做到这一点 ?

我尝试这个,但它不起作用:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
for (Article article : tagToDelete.getArticles()) {
    article.getTags().remove(tagToDelete);
}
session.delete(tagToDelete);

Thanks !

@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}到您的标签实体以防止删除标签以删除其关联的文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用JPA删除连接表中的行 的相关文章

随机推荐