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