为了账号安全,请及时绑定邮箱和手机立即绑定

仅将一行删除到连接表中

仅将一行删除到连接表中

慕桂英4014372 2022-06-23 20:21:52
问题是否可以将一行删除到由 @ManyToMany 注释创建的连接表中?语境使用此架构:标签TAGS_ARTICLES文章当一个标签从public Set<Tag> tags(一个列表到ARTICLE类)中删除时,相应的行TAGS_ARTICLES也被删除,但不是TAG表中的标签。唯一的方法是创建一个 SQL 脚本或 JPA/Hibernate 允许我们使用注释来做到这一点?代码我当前的代码是:article.getTags().remove(tag);此行从列表中删除标记,但未在数据库中完成更改。结论我看到了这篇文章:How to delete a row in join table with JPA,但也必须删除相关标签(不是我的情况)。谢谢。编辑 1:数据库中的预期结果删除前ARTICLE| article_id || a1         || a2         || a3         |TAGS_ARTICLES| article_id | tag_id || a1         | t1     || a1         | t2     || a2         | t2     |TAG| article_id || t1         || t2         |从 a1 标签列表中删除 t1 后ARTICLE| article_id || a1         || a2         || a3         |TAGS_ARTICLES| article_id | tag_id || a2         | t1     || a2         | t2     |TAG| article_id || t1         || t2         |编辑 2:加入表代码@Entitypublic class Article {     ...     @ManyToMany     @JoinTable(name = "tags_articles",        joinColumns = @JoinColumn(name = "idarticle"),        inverseJoinColumns = @JoinColumn(name = "idtag")     )     private Set<Tag> tags = new HashSet<>();     ...}
查看完整描述

2 回答

?
aluckdog

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包装中。


查看完整回答
反对 回复 2022-06-23
?
斯蒂芬大帝

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);

}


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信