jpa如何创建与父实体具有相同id的新实体(联合继承)

2023-12-09

我的问题非常类似于更改保留其 ID 的实体的类型,但我使用 InheritanceType.JOINED 而不是 Table_per_class。

这意味着我不更改任何表,只是创建一个新的子类,其 id 与超类相同。

总而言之,我有一个 Person 类和一个 Doctor,它扩展了 Person 并具有相同的 id。 我需要从数据库中检索一个 Person 并将其设为 Doctor,保留 Person 实体中的所有数据,但为 Doctor 实体创建一些额外的数据。

尝试合并医生会生成一个新的 ID,这对我来说无效。

这是我首先尝试过的

private Person getDoctor(Person person) {
            // Person already a doctor ==> OK
    if (person instanceof Doctor) {
        return person;
    }
            // Transient Person ==> //Transient Doctor OK
    if (person == null) {
        return new Doctor();
    }
            // Creates a Doctor from the person (only setting id...),
            // and merges it ==>
            fails as the id changes.
    Doctor doctor = new Doctor(person);
    return personDAO.merge(doctor);
}

sorry guys,first time here.

Here´s the code above:

    private Person getDoctor(Person person) {
    //Person already a doctor ==> OK 
       if (person instanceof Doctor) { 
            return person; 
    }


     //Transient Person ==> //Transient Doctor OK
        if (person == null) {
         return new Doctor(); 
        }
    //Creates a Doctor from the person (only setting id...), and merges it ==> fails as the id changes. 
    Doctor doctor = new Doctor(person);
    return personDAO.merge(doctor); 
    }


   @Inheritance(strategy = InheritanceType.JOINED)
   @Entity
   public class Person{
   }

   @Entity
   public class Doctor extends Person{
      public Doctor(Person person) {
        if (person != null) {
            this.setId(person.getId());
        }
    }
   }

就像您链接到的问题一样,答案是“您无法使用 Hibernate API 执行此操作”。

原因实际上很清楚 - Hibernate 的目标是使持久性尽可能透明,因此,不能允许您使用持久对象做一些普通 Java 对象无法做的事情。一旦你创建了一个实例Person(在普通的java中),它总是Person。它永远不会是Doctor。你能做的最好的事情就是创建一个Doctor实例和副本Person的属性。

然而,与普通 java 不同的是,使用 Hibernate,您可以作弊并实现您想要的:-),但它必须通过本机 SQL 来完成。在您的方法中,您需要:

  1. Evict Person来自会话的实例(以及二级缓存,如果适用)
  2. 插入具有匹配 ID 的行(取自Person实例)进入Doctors桌子。这是必须作为本机 sql 完成的部分,但您可以将其定义为命名查询并将上面的 id 设置为参数。请注意,如果有任何限制Doctor属性,您需要确保插入的值满足它们。
  3. Reload Person实例 - 现在将被加载为Doctor.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jpa如何创建与父实体具有相同id的新实体(联合继承) 的相关文章

随机推荐

  • C编程动态初始化二维数组

    我在这里做了一些愚蠢的事情 但我无法确切地指出是什么 void init data double data int dim x int dim y int i j k data double malloc sizeof double dim
  • 为什么seaborn计数图和直方图以不同的方式显示相同的十六进制颜色?

    我试图在我的论文中保留单一的调色板 我注意到我的直方图的蓝色和我的计数图的蓝色色调略有不同 即使我将它们设置为完全相同的十六进制值 我是否缺少一个设置 或者这些不同的图不仅仅显示给定的十六进制 我尝试过使用计数图饱和度 但它与颜色不匹配 理
  • 在 Git 中编写一个预推送挂钩来 grep 正则表达式的所有文件,如果未找到正则表达式,则希望拒绝推送

    我有以下预推钩 理想情况下 我希望它遍历所有推送到我的存储库的文件 如果任何文件的内容与顶部定义的正则表达式不匹配 则拒绝推送 尝试循环访问文件时出现以下错误 未定义方法 each for String NoMethodError each
  • 共享首选项或 SQlite

    我正在开发一个 Android AppWidget 它显示从配置活动输入的简短文本 在存储数据时我有点困惑 我应该使用共享首选项还是 SQlite 数据库 Thanks 这完全取决于您想要存储的数据 共享偏好 小数据 非结构化 例如登录信息
  • 将参数传递给同步过程调用

    创建线程对象时 我想从应用程序中调用需要同步的代码 问题是我不知道怎么打电话Synchronize对于带有参数的应用程序函数 说我们有 procedure ThreadObject Execute var val1 val2 integer
  • 创建嵌入式mysql数据库

    如何创建嵌入式mysql数据库与 C 定义 嵌入式 如果您尝试在未安装 MySQL 的情况下使用 MySQL 那么您就不走运了 SQLite 和 SQL Server Compact Edition 请参阅 Matthew 的链接 是您在不
  • 如何使同一项目中的另一个类可以访问变量?

    我有一个变量 PrincipleIndex 在一个班级 Principles cs 在一个 C 项目中 Bullseye Biz Logic Trading Principle Data Principles cs int Principl
  • mlpy - 动态时间扭曲取决于 x?

    I am trying to get the distance between these two arrays shown below by DTW 我正在使用Pythonmlpy提供的套餐 dist cost path mlpy dtw
  • 绘制根节点位于顶部的树状图

    我有以下玩具图 例如代表论坛主题 import igraph as ig g ig Graph n 12 directed True g add edges 1 0 2 1 3 2 4 3 5 1 6 2 7 6 8 7 9 0 10 0
  • 在 iPhone 上,如何使 URL 显示 App Store 中的条目?

    例如 如果有人在 iPhone 上查看某个应用程序的 URL 我们希望该 URL 能够打开 App Store 并显示与该应用程序相关的条目 这个想法是允许在 iPhone 上单击两次 单击链接 然后单击 安装 按钮 即可下载应用程序 这怎
  • 无法在 Mac Mojave 上将任何 C 程序与 gcc 链接

    我刚刚更新到 OSX 10 14 6 Mojave 现在 在升级 Xcode 并迁移 MacPorts 后 即使是最简单的 C 程序也不会与任何 gcc 版本链接 例如 链接程序 int main gives dcs16 gt gcc te
  • 垂直对齐多个不同高度的图像

    我有一个轮播脚本 它显示我正在处理的网站的所有用户 该轮播显示用户的头像 我尝试垂直对齐头像 但我无法正确对齐 我还在互联网上检查了其他主题 例如http codepen io chriscoyier pen oJeAK 但没有什么真正符合
  • 使用 altBeacon 库的 Android 中不显示所有信标

    我正在使用AltBEacon Android 库为开发一个适用于 Android 设备的 iBeacon 应用程序 我正在扫描信标 但是 仅找到四分之二的信标 有时是 1 4 我增加mBeaconManager setForegroundS
  • 如何使用 PowerShell 删除用户配置文件

    我有下面的脚本 如果我取消注释该行 3 我收到错误 Exception calling Delete with 0 argument s At Z Scripts Powershell Remove UserProfile ps1 48 c
  • 适用于 Android 的 catmull-rom 样条线

    我正在尝试找到一种在android平台上实现catmull rom样条线的方法 以便通过n个点平滑地绘制一条线 理想情况下 我能够通过 Path 及其cubicTo 方法调整三次贝塞尔曲线 如本线程中提到的 如何在 Android 中通过树
  • 如何列出目录中的所有子目录

    我正在开发一个项目 我需要列出目录中的所有子目录 例如 如何列出驱动器 C 中的所有子目录 Use Directory GetDirectories获取指定目录的子目录 你的目录路径 结果是一个字符串数组 var directories D
  • 我怎样才能忽略超类?

    我正在尝试编写一个网络服务java util loggingAPI 所以我写了一个继承自LogRecord的类MyLogRecord 我用JAX B注释对这个类进行了注释 包括 XmlAccessorType XmlAccessType N
  • 从纬度、经度转换为 x、y

    我想将 GPS 位置 纬度 经度 转换为 x y 坐标 我找到了很多关于这个主题的链接并应用了它 但它没有给我正确的答案 我按照以下步骤来测试答案 1 首先 我取两个位置并使用地图计算它们之间的距离 2 然后将这两个位置转换为x y坐标 3
  • 如何在 Django 中设置自定义中间件?

    我正在尝试创建一个中间件 以选择性地将 kwarg 传递给满足条件的每个视图 问题是我找不到如何设置中间件的示例 我见过重写我想要的方法的类 process view Class CheckConditionMiddleware objec
  • jpa如何创建与父实体具有相同id的新实体(联合继承)

    我的问题非常类似于更改保留其 ID 的实体的类型 但我使用 InheritanceType JOINED 而不是 Table per class 这意味着我不更改任何表 只是创建一个新的子类 其 id 与超类相同 总而言之 我有一个 Per