Hibernate JPA一对一保存子类实体

2023-12-26

我有一个一对一的关系,使用PrimaryKeyJoinColumn在父端注释。现在我想单独保存子实体。

例如,我有Employee and EmpInfo作为子实体,我需要保存EmpInfo(当然是在将父级的 id 属性设置为它之后)。但是,当使用这样的安排时,我会得到下面列出的异常......

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist

有什么想法为什么休眠不允许这样做吗?更清楚地说,我的代码如下......

父实体:

public class Employee {
    private Long id;
    private String name;
    private EmployeeInfo info;
    private Integer enumId;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    @Column(name="EMP_NAME")
    public String getName() {
        return name;
    }

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = CascadeType.REMOVE)
    public EmployeeInfo getInfo() {
        return info;
    }
  }

子实体:

@Table(name="EMP_INFO")
@Entity
public class EmployeeInfo {
    private Long id;
    private String email;

    @Column(name="EMPLOYEE_EMAIL")
    public String getEmail() {
        return email;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "emp_id", nullable = false)
    public Long getId() {
        return id;
    }
}

我尝试挽救它的方法是......

Employee emp = new Employee();
emp.setEnumId(SimpleEnum.COMPLETE);
emp.setName("Shreyas");
EmployeeInfo info = new EmployeeInfo();
info.setEmail("Sh@gmail");
concreteDAO.save(emp);   // This uses the JPATemplate provided by Spring JpaDaoSupport


info.setId(emp.getId());
concreteDAO.saveEmpInfo(info);

任何指示将不胜感激,我该如何尝试保存子实体?


这里的问题是@Id of EmployeeInfo被声明为自动生成,因此您不应该手动设置它(Hibernate 会查看传递给的实体persist并假设它已经在数据库中,因为@Id字段已填充)。

换句话说,删除@GeneratedValue on EmployeeInfo如果你想手动设置PK。

请注意,Hibernate 提供支持OneToOne通过自定义扩展在 JPA 1.0 中使用共享主键进行关联。看:

  • JPA Hibernate 一对一关系 https://stackoverflow.com/questions/787698/jpa-hibernate-one-to-one-relationship

在JPA 2.0中,派生标识符得到了很好的支持,您可以注释OneToOne and ManyToOne与 的关联@Id. See:

  • 通过一对一关系的主键 http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_Relationships
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate JPA一对一保存子类实体 的相关文章

随机推荐

  • JVM退出后守护线程如何存活?

    我正在阅读有关 Java 的文档setDaemon 方法 当我读到 JVM 不等待守护线程完成就退出时 我感到很困惑 然而 由于守护线程本质上是 JavaThread 它大概依赖在 JVM 上运行来实现其功能 如果 JVM 在守护线程完成之
  • 如何在不引入偏差的情况下生成一个范围内的随机 Rust 整数?

    如何在 Rust 中生成随机骰子 我知道我可以使用rand random 但这需要我想生成一个整数类型的值 使用rand random
  • 向oracle中的现有表添加自动增量主键[重复]

    这个问题在这里已经有答案了 我想向具有数据的现有表添加新的自动增量主列 我怎么做 我首先添加了一列 然后尝试添加一个序列 之后我失去了如何插入该列并将其作为主键 假设你的桌子叫t1你的主键叫做id首先 创建序列 create sequenc
  • Authorization_IdentityNotFound 错误 MS Graph API

    我们的应用程序将执行简单的 User ReadBasic All 功能 据我了解 这些功能不需要管理员权限 使用此处记录的流程 https graph microsoft io en us docs authorization app on
  • 如何通过URL中的ID获取单个资源?

    我有一个网址 例如 http example com page page id http example com page page id 我想知道如何获得page id路由中 url 的一部分 我希望我可以设计一些方法 例如 route
  • 无法弄清楚在 django 开发环境中提供静态图像

    我读了文章 http docs djangoproject com en dev howto static files 以及该主题上的其他人 但仍然无法弄清楚如何显示图像 除非将指向 Web 服务上现有文件的链接硬编码到 html 模板中
  • 在 NSTextView 中替换 NSTextStorage 的正确方法?

    我正在制作一些文本查看器应用程序 目前我需要非常频繁和精确的线路处理能力 所以我想子类化NSTextStorage班级 但我找不到任何方法来设置新的文本存储NSTextView 我能找到的唯一方法是 NSLayoutManager repl
  • 在 libc++ 中使用 double 调用 std::from_chars 时出现编译错误

    我有一个小代码如下 int main double d const char str 26 50 std from chars str str strlen str d std cout lt lt d 此代码在 libstdc 中按预期工
  • 在 Gtk 3 中向 ToolButton 添加图标

    有没有办法将图标添加到 Gtk ToolButton Gtk3 使用 PyGi for Python 以添加到 GTK 3 工具栏 下面是我的代码 self addfile Gtk ToolButton self addfile set l
  • rspec 模拟:验证“应该”方法中的期望?

    我正在尝试使用 rspec 的模拟来设置我可以在 应该 方法中验证的期望 但我不知道如何做到这一点 当我在模拟上调用 should receive 方法时 它before all 方法退出后立即验证预期的调用 这是一个小例子 describ
  • App Engine 标准第二代运行时的 Memcache 替代品

    谷歌已经发布了其通用版本App Engine 标准的第二代运行时 https cloud google com blog products serverless announcing cloud run the newest member
  • R- 找到值的唯一排列

    我希望创建包含两个不同值的向量的所有可能排列 其中我控制每个值的比例 例如 如果我有一个长度为 3 的向量 并且我想要包含单个 1 的所有可能组合 则我所需的输出是一个如下所示的列表 list 1 lt list c 1 0 0 c 0 1
  • 插值到特定时间

    假设我有这个代码 import numpy as np import time from datetime import datetime class Measurements def init self time var value se
  • 这个函数是怎么计算的呢?

    我一直在研究 CodeWars katas 并且发现了有人提出的一个非常酷的解决方案 我的问题是我不明白它是如何工作的 我了解其中的一些内容 就像它通常在做什么 但不了解细节 它自己回来了吗 它是如何进行计算的 有人可以向我解释一下这一点
  • Dagger:注入@Named 字符串?

    EDIT2023 06 28 除非您有充分的理由不这样做 否则只需使用 Spring Boot 作为您的平台 并使用它的自动布线以及所有其他免费功能 EDIT2018 02 08 演示如何执行此操作的示例项目位于https github c
  • 不可读的 Pom 文件 - Maven

    我一直在构建一个没有任何问题的项目 但突然遇到了这个错误 我尝试重新制作工作区 但现在每次都会遇到相同的错误 我正在尝试在 eclipse che 中使用 Maven 简单地构建和运行一个项目 Build command gt mvn cl
  • 在 Web API 中保存图像时无法解决“GDI+ 中发生一般错误”的问题

    我已经用谷歌搜索并搜索了这个原因的解决方案 但是 我无法找到这个问题的解决方案 我使用了从谷歌参考文献中获得的相同代码 下面是我的代码 public HttpResponseMessage Save ScreenCaptureDetails
  • 如何让下拉菜单在单击而不是悬停时打开/关闭?

    我对 javascript 和 ajax jquery 非常陌生 并且一直在努力尝试让脚本在单击而不是悬停时打开和关闭下拉菜单 有问题的菜单位于http www gamefriction com Coded http www gamefri
  • Go time.Tick 与 time.NewTicker

    我是 Go 新手 最近开始学习 我遇到过股票行情指示器和计时器 在代码中 我们可以通过两种方式创建代码 throttler time Tick time Millisecond 50 lt throttler throttler time
  • Hibernate JPA一对一保存子类实体

    我有一个一对一的关系 使用PrimaryKeyJoinColumn在父端注释 现在我想单独保存子实体 例如 我有Employee and EmpInfo作为子实体 我需要保存EmpInfo 当然是在将父级的 id 属性设置为它之后 但是 当