gpt4 book ai didi

java - 仅删除连接表中的一行

转载 作者:行者123 更新时间:2023-12-02 01:39:05 25 4
gpt4 key购买 nike

问题

是否可以删除@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<>();
...
}

最佳答案

编辑:查看评论

使用此设置应该会产生想要的结果

class Article {
...

@ManyToMany
@JoinTable(...)
private Set<Tag> tags = new HashSet<>();
}

class Tag {
...

@ManyToMany(mappedBy = "tags")
private Set<Article> articles = new HashSet<>();
}

Article实体正在取得关系的所有权。

<小时/>

旧答案

When a tag is removed from public Set<Tag> tags (a list into ARTICLE class) the corresponding row into TAGS_ARTICLES is removed too, but not the tag into TAG table.

据此,我了解到孤立记录不会被删除。而你想删除它们。这是正确的吗?

您可能想尝试使用 Hibernate 特定的 @Cascade注释( documentation )。
只需注释您的 Collection<T>字段。

@ManyToMany(...)
@Cascade(CascadeType.REMOVE) // or CascadeType.DELETE
private Set<Tag> tags = new HashSet<>();

请务必将其包含在 org.hibernate.annotations 中包。

关于java - 仅删除连接表中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54735882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com