Hibernate:将基类的实例更改为子类

2023-11-26

我想将一个具体的超类更改为其子类之一。我在下面提供了一个示例:

@Entity
@Table(name = "employees")
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee {

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

    public Employee( String id ) {
        this.id = id;
    }
 ...
}

@Entity
@Table(name = "managers")
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
public class Manager extends Employee {

    public Manager( String id ) {
        super(id);
    }
 ...
}


@Entity
@Table(name = "history")
public class History {
 ...
/**
 * 
 */
@ManyToOne
@JoinColumn(name = "employee_id")
private Employee employee;
 ...
}

我正在使用的三个类是 Employee、Manager 和 History。所有经理都是员工,但并非所有员工都是经理。所有员工(和经理)都有历史。员工可能会晋升为管理层。发生这种情况时,应通过保持员工 ID 不变来保留员工的历史记录。这样可以轻松找到经理的工作经历。

由于数据库中的约束,实现升级操作变得复杂:数据库将不允许删除旧的 Employee 并创建具有相同 ID 的新 Manager,而不通过级联操作删除所有 History 对象 - 人力资源部门将不允许这样做,否则我的工作会很轻松!

是否有可能add or attach经理(新经理)行到现有员工而不诉诸自定义 SQL 操作?

我尝试过以下解决方案但没有成功:

public void promote( Employee employee ) {
    /* copy over the ID of the employee to the manager.  Will not work because employee with ID already exists */
    Manager manager = new Manager(employee.getId());
    this.entityManager.persist( manager );
}

... 或者 ...

public void promote( Employee employee ) {
    /* detach the employee then merge.  Will not work: fails, again, with a NonUniqueObject Exception */
    this.entityManager.detach( employee );
    Manager manager = new Manager(employee.getId());
    this.entityManager.merge( manager );
}

我怎样才能完成这件事?我是否走在正确的轨道上detach() and merge()?

这在 Hibernate/JPA 中可能吗?

此时任何想法都会有所帮助,因为我很困惑!

  • Aaron

毫无疑问,您已经开始看到,您正在逆风划船。不幸的是,看起来你有一个经典的例子使用继承来表示角色。两者都是 Hibernate--Object- 关系映射器 - 和 Java - 一个Object- 面向语言 - 将在这一点上与你作斗争,因为你的对象模型是错误的。我想说你最好的选择是立即通过重构和数据迁移来修复它。最终的结果应该是每个人都是一名Employee,并且某些Employee与一个或多个部门或其他Employee存在某种“管理”关系。

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

Hibernate:将基类的实例更改为子类 的相关文章

随机推荐

  • 膨胀类 com.google.android.material.bottomnavigation.BottomNavigationView 时出错

    我正在尝试添加BottomNavigationView我的这个库的布局 implementation com google android material material 1 0 0 这是我的布局
  • 在 PHP 中用单引号打印换行符

    我尝试尽可能多地使用单引号 但我注意到我不能在单引号中使用 n 我知道我可以通过按回车键直接输入换行符 但这会破坏我的代码的缩进 当我使用单引号时 是否有一些 ASCII 字符或我可以输入的字符会产生换行符 不 因为单引号甚至禁止十六进制代
  • 计算忽略搜索引擎的页面浏览量?

    我注意到 StackOverflow 对每个问题都有一个浏览次数 并且这些浏览次数相当低且准确 我的一个网站上也有类似的东西 每当页面加载到后端代码中时 它基本上都会记录一个 点击 不幸的是 它也会对搜索引擎点击次数进行此操作 从而给出臃肿
  • 获取矩形与直线的交点

    我需要得到矩形和直线的交点 我的 B 点位于矩形 矩形中心 内部 A 点位于外部 我需要在矩形边框之一上找到 C 点 我还得到了矩形的宽度和高度 这一切都将是WPF应用程序 所以如果有任何内置功能我会非常高兴 这是基本数学求解线与线相交的问
  • 在 python 正则表达式中匹配 unicode 表情符号

    我需要提取文本中数字和表情符号之间的文本 示例文本 blah xzuyguhbc ibcbb bqw 2 extract1 jbjhcb 6 extract2 bjvcvvv output extract1 extract2 我编写的正则表
  • 在 Flutter 中使用 Firebase 身份验证检查用户是否是新用户

    根据底部这一页 AdditionalUserInfo提供了一个方法叫做isNewUser 例如 检查社交登录 Facebook Google 等 是否是登录或注册 给出了一个例子这个答案 Flutter 的问题是我找不到任何名为Additi
  • 并行运行一组 TaskEithers,但如果 1 个或多个任务失败则继续

    我必须并行进行一组 IO 调用 如果成功则合并调用的内 容 如果其中一个失败 其他的将按正常方式处理 但会出现一条错误消息 我对如何实现这一点的思考过程 Array
  • For-In 循环多个条件

    随着 Xcode 7 3 的新更新 出现了很多与新版本 Swift 3 相关的问题 其中一个问题是 C 风格的 for 语句已被弃用 将在未来版本的 Swift 中删除 这出现在传统的 Swift 版本中 for声明 其中一个循环有多个条件
  • 更改导航后退按钮的目的地

    如何更改默认导航后退按钮将我带到的视图控制器 后退按钮通常会将您带回到上一个视图控制器 但是如果我想让它通过两个视图控制器返回怎么办 我的意思是我想更改后退按钮将我带到的视图控制器 我不喜欢创建自定义后退按钮 那么还有其他办法吗 可能是与后
  • 不同方法名的接口实现

    我有这个界面 public interface INameScope void Register string name object scopedElement object Find string name void Unregiste
  • 对于不使用 Emacs 的 Windows 用户是否值得交换 Ctrl 和 Caps Lock

    我已经了解 Steve Yegge 的建议交换 Ctrl 和 Caps Lock虽然我不使用 Emacs 但已经有一段时间了 我刚刚尝试将它们交换作为实验 但发现很难调整 现在有几个快捷键对我来说已经是第二天性了 但我还没有意识到它们在我使
  • 使用正则表达式进行 LDAP 搜索

    有没有办法可以使用字段的正则表达式在 LDAP 上进行搜索 我在用LDAP搜索或 Sun Java System Directory Server 控制中心 进行搜索 答案是否定的 你不能 为什么 因为 LDAP 标准将 LDAP SEAR
  • Python。 Matplotlib 倒置图像

    我不知道这里出了什么问题 import matplotlib pyplot as plt im plt imshow plt imread tas png plt show 并且Y轴反转了 所以我写了一篇论证origin lower im
  • 将数学表达式中的^(幂)符号替换为C的pow语法

    我有一个数学表达式 例如 2 x 3 2 x 5 7 10 0 5 我需要更换 符号到powC语言的函数 我认为正则表达式是我所需要的 但我不知道像专业人士那样的正则表达式 所以我最终得到了这个正则表达式 s s 我不知道如何改进这一点 你
  • 在父级 Shiny 服务器中调用反应式数据集的 Shiny 模块

    我正在寻求移植一些较旧的闪亮应用程序以使用闪亮模块 但在尝试移植我的反应式表达式时遇到了麻烦 根据文档 目标不是阻止模块与其交互 包含应用程序 而是使这些交互变得明确 如果一个 模块需要使用反应式表达式 取反应式 表达式作为函数参数 我有现
  • Monotouch和XCode 4,风口去哪儿了?

    今天我用最新版本的 MonoDevelop MonoTouch 和 Mono Framework 更新了我的 mac 我还下载了最新版本的 XCode 版本 4 一个漂亮的 4 5 gig 下载 起初我没有注意到它 因为我正忙着将代码复制到
  • Clojure 中的多态模式验证

    我想使用架构来验证请求对象 映射中的值之一决定哪些其他字段有效 例如 这些都是有效的 name jane type dog barking true name alan type bird cheeping true name bert t
  • 失败,因为:de.measite.minidns.hla.ResolutionUnsuccessfulException:请求 xxxx。 IN AAAA 产生错误响应 NX_DOMAIN

    在我升级 smack 到 4 2 0 后 我遇到了连接问题 The following addresses failed xxxx 5222 failed because de measite minidns hla ResolutionU
  • 无需数据绑定即可渲染值

    在 AngularJS 中 如何在没有 2 路数据绑定的情况下渲染值 出于性能原因 或者甚至在给定时间点渲染一个值 人们可能想要这样做 以下示例均使用数据绑定 div value div div div 我如何渲染value 没有任何数据绑
  • Hibernate:将基类的实例更改为子类

    我想将一个具体的超类更改为其子类之一 我在下面提供了一个示例 Entity Table name employees Inheritance strategy InheritanceType JOINED public class Empl