仅将一行删除到连接表中

问题

是否可以将一行删除到由 @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:加入表代码


@Entity

public class Article {

     ...

     @ManyToMany

     @JoinTable(name = "tags_articles",

        joinColumns = @JoinColumn(name = "idarticle"),

        inverseJoinColumns = @JoinColumn(name = "idtag")

     )

     private Set<Tag> tags = new HashSet<>();

     ...

}


慕桂英4014372
浏览 96回答 2
2回答

aluckdog

使用此设置应该会产生想要的结果class Article {&nbsp; &nbsp;...&nbsp;&nbsp;&nbsp; &nbsp;@ManyToMany&nbsp; &nbsp;@JoinTable(...)&nbsp; &nbsp;private Set<Tag> tags = new HashSet<>();}class Tag {&nbsp; &nbsp;...&nbsp; &nbsp;@ManyToMany(mappedBy = "tags")&nbsp; &nbsp;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.DELETEprivate Set<Tag> tags = new HashSet<>();请务必将其包含在org.hibernate.annotations包装中。

斯蒂芬大帝

实体操作的行为取决于关系的所有权,这取决于您将mappedBy属性放置到注释的位置。拥有的实体mappedBy是不是所有者的实体。关系的双方都不能是所有者。在这里,您需要确定正确的所有者。假设标签是所有者。然后在删除标签时,关系 TAGS_ARTICLES 将自动更新。删除 TAGS_ARTICLES 时,您必须自己删除关系。@Entitypublic class Tag{&nbsp; &nbsp; @ManyToMany&nbsp; &nbsp; Set<Tag_Articles> articles;&nbsp; &nbsp; //...}@Entitypublic class Tag_Articles{&nbsp; &nbsp; @ManyToMany(mappedBy="articles")&nbsp; &nbsp; Set<Tag> tags;&nbsp; &nbsp; //...}对于像上面这样的实体关系,你可以尝试这样的 -entityManager.remove(articles)for (Tag tag: articles.tags) {&nbsp; &nbsp; &nbsp;tag.articiles.remove(articles);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java