当前位置: 首页 > 知识库问答 >
问题:

删除与另一个对象具有许多关系的对象

唐高朗
2023-03-14

我有一个名为 Article 的实体类,另一个名为 ArticleTag 的实体。这两个实体是许多多属性关系,这意味着许多文章可以链接到同一个标签,并且许多标签可以与同一篇文章相关联。

在我的文章实体中,我有以下内容:

        @ManyToMany(cascade = {CascadeType.ALL})   
        @JoinTable(name = "table_articleId_tagId",
                  joinColumns = {@JoinColumn(name ="article_id")},
                  inverseJoinColumns = {@JoinColumn(name = "tag_id")})
        private Set<ArticleTag> tags = new HashSet<ArticleTag>();

在我的ArticleTag实体中,我有这个:

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

当我的控制器被调用来删除一篇文章时,我在我的ArticleDao类中使用了一个方法,该方法基本上正在这样做:

Transaction tx = session.beginTransaction();
session.delete(article);
tx.commit();

但是,我的文章无法删除。我不确定是什么导致了此失败。我想知道我是否应该首先使用Eager Fetch删除标签。但这听起来不对,因为同一个标签可能会链接到另一篇文章。那么,在不删除仍然与另一篇文章相关联的相关标签的情况下删除文章的正确方法是什么?

编辑:

感谢@Vlad Mihalcea的建议。有了这个灵感,我开始考虑通过创建一个名为ArticleAndTagLink的中间实体,将文章和ArticleTag之间的ManyTo多关系重构为两个OneTo多关系。

因此,我的想法是在Article/ArticleTag与ArticleandTagLink实体之间创建一对一关系。这将使我能够利用Article或ArticleTag实体上的“orphanRemovement=true”注释。当我想删除一篇文章时,此注释将帮助我删除关联的ArticleandTagLink对象,如果它不再关联任何其他ArticleTag对象,我将删除该标记。我认为这可能有效,可能比遍历标记更有效。如果行得通,我明天再报告!

共有1个答案

杜建章
2023-03-14

Hibernate删除级联与SQL删除不同。对于@ManyTo多关联,删除将传播到实际实体,而不是关联表,这不是您想要的。

要删除这两个表之间的关联,在删除<code>文章

>

  • 将 delete-orphan=true 添加到 Article.tags

    您需要初始化< code>Article.tags集合。

    由于您有双向关联,因此您也必须从标签中删除文章。迭代Article.tags并从Article.tag.articleSet中删除当前文章(此操作可能最终以N 1操作结束,因此Batch/Subselect获取可能会有所帮助)。

    从要删除的文章中删除所有标签。

    删除文章

  •  类似资料:
    • 我的两个实体有一对一的关系 我尝试通过此方法删除我的用户实体 PasswordResetTokenRepository类,我在服务方法中调用了该类,用于删除用户,我使用了常规Hibernate方法deleteById(Long id) 但是当我尝试通过此方法删除时,出现此错误:not-null 属性引用 null 或瞬态值:kpi.diploma.ovcharenko.entity.user.Pa

    • 我正在努力理解如何处理与JOOQ的一对多和多对多关系的Pojo。 我存储玩家创建的位置(一对多关系)。一个位置可以容纳多个可能访问它的其他玩家(多对多)。数据库布局可归结为以下内容: 在我的java应用程序中,所有这些信息都存储在一个pojo中。请注意,玩家和受邀玩家列表可以从应用程序中更新,也需要在数据库中更新: 我可以使用JOOQ的pojo映射将这三个记录映射到单个pojo吗?我可以使用这个p

    • 我的实体: 这就是我的问题,实际上很少有。 问题1: 我删除了一个Cat对象,设置了cascade类型。所有在Cat中拥有的列表中,因此当我删除Cat对象时,UC中带有Cat的所有记录都将被删除,但我得到“已删除的对象将通过级联重新保存”,这是因为我在UC中与用户有另一个关系,用户将UC存储在列表中。当我从UC中删除Cat对象和记录时,我不想删除用户对象,因此在UC中的@ManyToOne上设置c

    • 我有以下型号: 当我运行下面的查询时,用户模型也被删除 有没有办法在不删除用户的情况下删除问题? 我试着重复这些问题但没有用 我认为查询集是懒惰的,所以也许我需要在删除之前评估它,所以我打印了它,但这不起作用。 我知道,将ForeignKey设置为null将为我提供诸如clear和remove之类的方法,但我不想这样做,因为我不希望出现任何孤立的用户问题。 我更新了ForeignKey,如下所示

    • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认

    • 我有一个桌子实验和一个桌子标签。一个实验可能有许多标签。架构: 是否可以使用返回实验和相应标签列表的jooq创建查询? 类似