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

标签 hibernate many-to-many jointable mappedby

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

  • 文章
  • ARTICLE_TAG
  • 标签

  • 当我删除标签时,我想删除:
  • TAG中的标签
  • 标签与ARTICLE_TAG中标记的文章之间的所有关系

  • 但我当然不想删除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/

    相关文章:

    java - 外键必须与引用主键具有相同的列数 Hibernate - 多对多

    java - 有人可以告诉我代码中的错误吗?

    python - 从多对多字段中获取对象

    mysql - 动态连接表 MySQL

    java - 将 hibernate 对象直接转换为 XML 时的任何特殊注意事项

    hibernate - 来自方法的Spring数据查询无法识别列

    sql-server - 如何在 yii2 中处理多对多关系以及如何将数据插入桥接表

    mysql - 未找到列 : 1054 Unknown column 'managers.id' in 'on clause' in Laravel 5 Many-to-Many relationship query

    php - 将 MySQL 值存储为整数

    ruby-on-rails - Rails Mechanize 连接表循环