如何在Spring Data JPA中插入对象时添加引用表Id

2024-04-02

我一直在玩 JPA,遇到了这种情况,想知道如何解决这个问题。

我有 2 个表,即公司和员工。 所以这里一个员工只能为1家公司工作,因此@OneToOne单向映射是在Employee类中完成的。公司表中的公司详细信息已经存在。

因此,当我尝试将记录插入 Employee 表时,我什至创建对公司的引用,将其添加到 Employee 类并使用 EmployeeRepository 的 save 方法保存它。由于 company_id 已经存在于 Company 表中,因此应该仅引用它而不是创建新公司。但这并没有发生。 我得到一个异常说company object is still in the transient state.我可以通过添加来解决这个问题CascadeType.All但我不需要插入公司,而只需将公司与员工联系起来。

这是代码片段。

员工阶层

@Entity
@Table(name = "employee")
@Setter
@Getter
public class Employee
{
    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "employee_id")
    private Integer employeeId;

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

    @OneToOne
    @JoinColumn(name = "company_id")
    private Company company;

}

公司类

@Entity
@Table(name = "company")
@Setter
@Getter
public class Company
{
    @Id
    @GeneratedValue
    @Column(name = "company_id")
    private Long id;

    @Column(name = "company_name")
    private String companyName;
}

公司表

company_id  company_name
1           Dell
2           Apple
3           Microsoft

这是我创建 Employee 对象的方法

Employee emp = new Employee();
emp.setEmployeeId(10);
emp.setEmployeeName("Michael");

Company company = new Company();
company.setId(1);
emp.setCompany(company);

employeeRepository.save(emp);

请有人让我知道如何将公司类别链接到员工类别,而不是再保存一家公司。


对我来说最好的解决方案是使用代理延迟加载您的公司。要使用 Spring Data JPA 执行此操作,您需要扩展您的公司存储库JpaRepository。这使您可以访问该方法获取参考ID https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html#getReferenceById(ID) :

Employee emp = new Employee();
emp.setEmployeeId(10);
emp.setEmployeeName("Michael");
emp.setCompany(companyRepository.getReferenceById(1))

employeeRepository.save(emp);

如果给定 ID 没有公司,则EntityNotFoundException是扔。

使用代理,您在大多数情况下可以避免对数据库的请求,因为 Hibernate 使用其缓存来检查公司是否存在。但是如果我没记错的话,Hibernate 会在每次调用代理的 getter 时向数据库发出请求,除了getId()。因此,就您的情况而言,这是一个很好的解决方案,但不要一直使用它。

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

如何在Spring Data JPA中插入对象时添加引用表Id 的相关文章

随机推荐

  • 如何将序列中的下一个值放入变量中?

    因此 我正在编写一个存储过程 但无法将序列的下一个值放入变量中 序列名称被传递到函数中并存储为varchar2多变的 如何将该序列中的下一个值放入局部变量中 像这样的东西吗 create or replace procedure next
  • gulp 命令给出找不到模块的错误

    我正在尝试在 Windows 上设置基本的 aurelia 应用程序 我已遵循以下指示 http aurelia io get started html http aurelia io get started html 包括 安装节点js
  • 如何获取宿主元素引用?

    如何获取 Angular 2 中的宿主元素引用 就我而言 我想知道我的组件是否有焦点 您可以使用以下方式获取宿主元素引用 class MyComponent constructor private elRef ElementRef cons
  • 为什么我不应该有一个单一的整体实用程序库?

    我们有一些通用库 C 但我想这不是特定于平台或语言的 我们称它们为 A B 和 C 库 A 引用了 B 和 C 库 B 引用了第三方 DLL 库 C 是独立的 三个独立项目背后的想法是 每个库都有不同的功能 但随着时间的推移 库 A 或多或
  • mysql 使用另一个表中的值更新列

    我有两张桌子 看起来都像 id name value 1 Joe 22 2 Derk 30 我需要复制的值value from tableA to tableB基于每个表中的检查名称 对此有何建议UPDATE陈述 除了这个答案之外 如果您需
  • 连接表达式以获取数据帧的子集

    我正在尝试创建一个函数来计算子集数据框中列的平均值 这里的技巧是 我总是想要有几个子集条件 然后可以选择将更多条件传递给函数以进一步子集数据帧 假设我的数据如下所示 dat lt data frame var1 rep letters 26
  • Paster db init -c XXXX/development.ini 不适用于 CKAN 命令“db”不知道

    我是 CKAN 和 python 的第一次用户 我的大部分开发都是在 NET 我是第一次在 Windows 7 计算机上设置 CKAN 我正在尝试运行该行 paster db init c FOLDER NAME development i
  • PHP中如何获取最后修改的文件?

    我想创建一个列表 列出上次修改的文件的名称 http www searchr us web search 我想在我的主页上显示这些文件名 它们应该根据上次修改的文件进行更改 你可以使用这个功能 function listdir by dat
  • 调用未定义函数password_hash()

    我正在开发我的网站时 现在正在本地主机上运行 php 版本 5 4 16 我想用password hash 但我不断收到此错误 致命错误 调用未定义函数password hash dir to file php在线的123 为什么会发生这种
  • 如何加载目录中的所有文件?

    正如标题所说 如何加载目录中的每个文件 我对c 和lua都感兴趣 编辑 对于 Windows 我很高兴能得到一些真正的工作代码 尤其是 lua 我可以用 boost filesystem for c 来做 对于 Lua 你需要模块Lua文件
  • Heroku 30 秒超时(长外部查询)的解决方法

    注意 这篇文章中的某些内容可能不是最佳实践 被警告 我正在开发一个连接到微实例 AWS 服务器的管理仪表板 该数据库拥有数千万条记录 大多数查询都会在几秒钟内返回 但有些查询需要长达一两分钟的时间才能返回 这取决于我无法控制的一些事情 由于
  • GHC如何实现unsafePerformIO?

    从 开始unsafePerformIO并以 RTS libc 或操作系统 API 结束 GHC 如何实现 IO 我试图了解当标准前奏不可用时 IO 在 Haskell 中如何工作 例如 如果我们出于某种原因自己实现标准前奏 我原本希望在 G
  • 寻找参考nodejs,expressjs和mongodb应用程序用作模板

    我想构建一个 Nodejs 应用程序 并且正在寻找一个很好的参考应用程序来用作模板 理想情况下 该应用程序应具有以下功能 使用nodejs expressjs 和 mongodb 有一个用户认证子系统 我想下载这样一个应用程序并让它开箱即用
  • stylesheet_pack_tag 在使用 webpacker gem 的 Rails 5.1 中找不到 app/javascript/src/application.css

    当我尝试使用 webpacker 在新的 Rails 5 1 应用程序中加载页面时 收到此错误 我希望 webpacker 也能处理 CSS Started GET for 1 at 2017 09 01 12 20 23 0400 Pro
  • Git暂存区只是一个索引吗?

    Pro Git 一书说 暂存区域只是一个列表或索引 它说明了当某个文件发生变化时将提交哪些文件 git commit完成了 现在的名字index通常被称为 暂存区 但是如果我们修改文件foo txt这已经是回购协议的一部分 并使用git a
  • 在 Mathematica 中计算此递推关系的更有效方法

    Verbeia 对 Mathematica 中函数式编程风格的表现展开了一场相当有趣的讨论 在这里能找到它 在 Mathematica 中构建大型分块矩阵最有效的方法是什么 https stackoverflow com q 6867079
  • 实现 GLSurfaceView.Renderer 问题

    代码源自教程 我正在开始一些OpenGL ES 2 0对于Android系统 我从以下位置获取了以下代码 http developer android com training graphics opengl environment htm
  • 在 iOS 中,线程安全意味着什么?

    我经常遇到 线程安全 这个关键术语 并想知道它的含义 例如 在 Firebase 或 Realm 中 某些对象被视为 线程安全 线程安全到底意味着什么 线程不安全 是否允许多个线程同时修改任何对象 线程安全 如果任何对象不允许被多个线程同时
  • 为什么这个 Java 应用程序在 Mac 上运行缓慢,而不是在 PC 上运行? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用Java创建了一个应用程序 它在Windows平台上运行顺利 然而 当在配备 4960HQ 的 Macbook Pro Reti
  • 如何在Spring Data JPA中插入对象时添加引用表Id

    我一直在玩 JPA 遇到了这种情况 想知道如何解决这个问题 我有 2 个表 即公司和员工 所以这里一个员工只能为1家公司工作 因此 OneToOne单向映射是在Employee类中完成的 公司表中的公司详细信息已经存在 因此 当我尝试将记录