由于键更改而尝试插入时外键约束失败

2024-06-19

我有一个 Content 对象,它引用多对多关系中的一组 Tag 对象。作为持久化新内容对象的一部分,我在 PostgreSQL 中查看标签是否已存在,如果存在,则将对其的引用添加到内容对象并尝试保存内容对象。我遇到的问题是,当我这样做时,我将标签与 id 关联起来,例如1 和 2 的内容,当我尝试保存内容时,它因外键冲突而失败,因为它说 id 10 的标签不存在。我单步执行了代码,当我将标签添加到与内容关联的标签集时,它具有正确的 id(即 1 和 2),那么为什么当我保存它时它会更改为不同的 id?我正在使用 JPA、Hibernate、Spring 和 PostgreSQL。我在下面附加了休眠内容对象。 “content_tag”表仅由 content_id 和 tag_id 组成,它们是对内容表和标签表的外键引用。澄清一下:此实例中的标签已经创建,我只是通过在数据库中搜索它们并将其关联添加到内容来添加关联

这是错误:

org.postgresql.util.PSQLException: ERROR: insert or update on table "content_tag" violates foreign key constraint "tag_id_fkey"
  Detail: Key (tag_id)=(12) is not present in table "tag".

显示尝试保存的代码:

for (final String tag : request.getContent().getTags()) {
    final List<Tag> current = tagRepository.findByName(tag);
    if (current.isEmpty()) {
        final Tag newTag = new Tag(tag);
        tagRepository.save(newTag);
        content.addTag(newTag);
    } else {
        content.addTag(current.get(0));
    }

}
final Content response = contentRepository.save(content);

这是内容类:

@Entity(name = "Content")
@Table(name = "content")
@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)
public class Content implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Type(type = "StringJsonObject")
    @Column(name = "text")
    private String text;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    @ManyToMany(cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE
    })
    @JoinTable(name = "content_tag",
            joinColumns = @JoinColumn(name = "tag_id"),
            inverseJoinColumns = @JoinColumn(name="content_id")
    )
    private Set<Tag> tags = new HashSet<>();

    public Set<Tag> getTags() {
        return tags;
    }

    public void setTags(Set<Tag> tags) {
        this.tags = tags;
    }

    public void addTag(Tag tag) {
        tags.add(tag);
        tag.getContents().add(this);
    }

    public void removeTag(Tag tag) {
        tags.remove(tag);
        tag.getContents().remove(this);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Content)) return false;
        return id != null && id.equals(((Content) o).getId());
    }

    @Override
    public int hashCode() {
        return 31;
    }
}

标签实体:

@Entity(name = "Tag")
@Table(name = "tag")
public class Tag implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToMany(mappedBy = "tags")
    private Set<Content> contents = new HashSet<>();

    public Tag() {}

    public Tag(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Content> getContents() {
        return contents;
    }

    public void setContents(Set<Content> contents) {
        this.contents = contents;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Tag tag = (Tag) o;
        return Objects.equals(name, tag.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

将内容实体中关系的配置更改为:

@JoinTable(name = "content_tag",
        joinColumns = @JoinColumn(name = "content_id"),
        inverseJoinColumns = @JoinColumn(name="tag_id")
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于键更改而尝试插入时外键约束失败 的相关文章

随机推荐

  • 内容交付的正确 DTAP 设置

    我已经有了这个设置 但似乎不太正确 您将如何改进多个 NET 客户 开发团队的内容交付 CD 开发 CMS 服务器 gt 演示服务器环境 CMS 制作 gt 实时和预览网站 CMS 组合测试 验收 内部称为 分期 gt 上线 分期 CMS
  • Camera2设置预览(View)并获取预览回调

    我想从 Camera2 获取预览以及用于处理帧的 byte 回调 mImageReader ImageReader newInstance largest getWidth largest getHeight ImageFormat RAW
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • Lotus Notes/Domino 开发版本控制的最佳实践

    请分享您如何对 Lotus Notes Domino 开发进行版本控制 我想将所有脚本 视图 自定义表单 脚本库等放入我们的 SVN 存储库中 半自动方法也被接受 即 如果我找到一种方法来获取一个文件中表单的所有事件脚本 并能够将其作为整个
  • 对齐卡片视图中的项目

    我希望我的卡片如下所示 我保持这样的布局
  • 如何在SparkR中进行map和reduce

    如何使用 SparkR 进行映射和归约操作 我能找到的只是有关 SQL 查询的内容 有没有办法使用 SQL 进行映射和减少 See 写入从 SparkR map 返回的 R 数据帧 https stackoverflow com quest
  • 如何以编程方式在 Android 中查找平板电脑或手机?

    我的情况是 手机和平板电脑的逻辑是相同的 但布局上略有不同 我尝试使用以下代码 public static boolean findoutDeviceType Context context return context getResour
  • 使用 jQuery / .data() 避免内存泄漏

    我正在使用 jQuery 动态创建 HTML 元素 现在需要针对它们存储 JavaScript 数据 但是 我现在担心内存泄漏 因为我实际上从未在对象上调用 删除 我 append 和 detach 它们 但从不 remove jQuery
  • jQuery,获取一个元素的宽度并应用于另一个元素

    有没有一种方法可以获取一个元素的宽度 container例如并将其应用到另一个 item例如 我的布局是响应式的 因此为什么我不能直接给出 item固定宽度值 像这样 item width container width Demo gt h
  • 对浮点数求和的最佳 OpenCL 2 内核是什么?

    C 17引入了许多新算法来支持并行执行 特别是标准 减少 http en cppreference com w cpp algorithm reduce是一个并行版本std 累积 http en cppreference com w cpp
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 使用AT命令发送消息时CMS Error 500错误

    我正在尝试在超级终端使用 AT 命令发送短信 我使用的是华为E1552 我收到此错误 CMS ERROR 500 我需要帮助找出导致此错误的原因 谢谢 这是一个旧线程 但为了将来的参考 我想这会很有用 CMS 错误 500基本上是指未知错误
  • 如何将 数组传递给存储过程

    我有一个清单索赔数据在 C 中 它有三个项目 日期 类型和描述 其中可以有多行 如下所示 索赔数据 Date Type Description 01 02 2012 Medical Its a medical 05 02 2013 Thef
  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • 不允许对IsolatedStorageFile Stream 进行操作

    创建文件后打开该文件时出现错误 using var myFileStore IsolatedStorageFile GetUserStoreForApplication myFileStore CreateFile DateTime Now
  • InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务

    我开始将我的 asp net core RC1 项目转换为 RC2 并面临现在的问题IHttpContextAccessor没有解决 为了简单起见 我使用 Visual Studio 模板创建了新的 ASP NET RC2 项目ASP NE
  • 无法填充名为“status”的数组

    我正在尝试做一些非常简单的事情 在 Javascript 中初始化一个数组 而且它在 Google Chrome 中不起作用 这是代码 status for i 0 i lt 8 i status i false alert status
  • 由于键更改而尝试插入时外键约束失败

    我有一个 Content 对象 它引用多对多关系中的一组 Tag 对象 作为持久化新内容对象的一部分 我在 PostgreSQL 中查看标签是否已存在 如果存在 则将对其的引用添加到内容对象并尝试保存内容对象 我遇到的问题是 当我这样做时