Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅将行删除到联接表中_Java_Spring_Hibernate_Spring Boot_Jpa - Fatal编程技术网

Java 仅将行删除到联接表中

Java 仅将行删除到联接表中,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,问题: 是否可以将一行删除到@ManyToMany注释创建的联接表中 上下文 使用此模式: 标签 标签和物品 文章 当一个标记从公共集合标记中移除时,一个列表进入文章类,相应的行进入标记中,文章也被移除,但标记不进入标记表 唯一的方法是创建一个SQL脚本或JPA/Hibernate,它允许我们通过注释来实现吗 代码 我当前的代码是:article.getTags.removetag 此行将从列表中删除标记,但更改不会在数据库中完成 结论 我看到了这篇文章:,但相对标签也必须删除,我的情况不是这样

问题:

是否可以将一行删除到@ManyToMany注释创建的联接表中

上下文

使用此模式:

标签 标签和物品 文章 当一个标记从公共集合标记中移除时,一个列表进入文章类,相应的行进入标记中,文章也被移除,但标记不进入标记表

唯一的方法是创建一个SQL脚本或JPA/Hibernate,它允许我们通过注释来实现吗

代码

我当前的代码是:article.getTags.removetag

此行将从列表中删除标记,但更改不会在数据库中完成

结论

我看到了这篇文章:,但相对标签也必须删除,我的情况不是这样

谢谢

编辑1:数据库中的预期结果

删除前

从a1标签列表中删除t1后

编辑2:联接表代码

编辑:参见注释

使用此设置应产生所需的结果

class Article {
   ...  

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

class Tag {
   ...

   @ManyToMany(mappedBy = "tags")
   private Set<Article> articles = new HashSet<>();
}
请确保将其包含在org.hibernate.annotations包中。

编辑:请参阅注释

使用此设置应产生所需的结果

class Article {
   ...  

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

class Tag {
   ...

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

请确保将其包含在org.hibernate.annotations包中。

实体操作的行为取决于关系的所有权,这取决于将mappedBy属性放置到注释的位置。具有mappedBy的实体不是所有者。关系的双方都不能是所有者

在这里,您需要确定正确的所有者。假设标签是所有者。然后,当删除标记时,关系标记将自动更新。当删除一个标签或文章时,您必须自己注意删除关系

@Entity
public class Tag{
    @ManyToMany
    Set<Tag_Articles> articles;
    //...
}

@Entity
public class Tag_Articles{
    @ManyToMany(mappedBy="articles")
    Set<Tag> tags;
    //...
}

实体操作的行为取决于关系的所有权,这取决于将mappedBy属性放置到注释的位置。具有mappedBy的实体不是所有者。关系的双方都不能是所有者

在这里,您需要确定正确的所有者。假设标签是所有者。然后,当删除标记时,关系标记将自动更新。当删除一个标签或文章时,您必须自己注意删除关系

@Entity
public class Tag{
    @ManyToMany
    Set<Tag_Articles> articles;
    //...
}

@Entity
public class Tag_Articles{
    @ManyToMany(mappedBy="articles")
    Set<Tag> tags;
    //...
}


老实说,我不知道你在问什么。我迷路了。你写了。。。但不能将标签放入标签表中。那么,您要删除哪些行?对不起,如果我不清楚。。。只有行进入联接表,所以只有行进入标记。我不想将标记删除到标记中,因为它可以被其他文章使用。@LppEdd我在我的问题中添加了一个示例。请看我更新的答案。老实说,我不确定你在问什么。我迷路了。你写了。。。但不能将标签放入标签表中。那么,您要删除哪些行?对不起,如果我不清楚。。。只有行进入联接表,所以只有行进入标记。我不想将标记删除到标记中,因为它可以被其他文章使用。@LppEdd我在问题中添加了一个示例。请看我的更新答案。当我从文章中删除标记时,标记仍然正确地从列表中删除,但如果我执行GET测试请求,我会在文章中使用Postman,标签仍然存在于列表标签上。因此,即使我添加@ManyToManymappedBy=tags,也没有任何更改。@N.Lamblin您是否通过实体管理器持久化实体?你有交易吗?如果我有交易,那不是我的选择。关于实体管理器,我使用import javax.persistence.*;包;。我是这些工具的初学者,很抱歉我不称职,所以很难告诉您,但我没有明确创建EntityManager实例。@N.Lamblin如果我理解正确,您正在使用Spring存储库,对吗?因此我将重新阅读此文档。再次感谢。当我从文章中删除标记时,标记仍然正确地从列表中删除,但是如果我执行GET测试请求,我会在文章中使用Postman,标记仍然存在于列表标记中。因此,即使我添加@ManyToManymappedBy=tags,也没有任何更改。@N.Lamblin您是否通过实体管理器持久化实体?你有交易吗?如果我有交易,那不是我的选择。关于实体管理器,我使用import javax.persistence.*;包;。我是这些工具的初学者,很抱歉我不称职,所以很难告诉您,但我没有明确创建EntityManager实例。@N.Lamblin如果我理解正确,您正在使用Spring存储库,对吗?因此我将重新阅读此文档。再次感谢您。感谢您的回答,但有了这个答案,我必须创建一个实体来标记您的文章,这是解决我的问题的义务吗?因为我的愿望是自动更新。谢谢你的回答,但是有了这个答案,我必须创建一个实体来标记文章,解决我的问题是义务吗?因为我的愿望是自动更新。
@ManyToMany(...)
@Cascade(CascadeType.REMOVE) // or CascadeType.DELETE
private Set<Tag> tags = new HashSet<>();
@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);
}