gpt4 book ai didi

java - 使用 Hibernate 连接子类,是否可以复制 super 表和子表中的列*并*保持它们同步?

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:28 27 4
gpt4 key购买 nike

所以我遇到了一个有趣的情况。我继承了一大堆乱七八糟的代码,原始开发人员决定放弃使用继承,转而使用枚举和 switch 语句……这是 this anti-pattern 的完美示例。现在是重构的时候了,我决定最好的方法是提取一个由具有共享列的表支持的父类(super class),然后使用连接的子类继承策略。到目前为止一切顺利...

现在棘手的部分是该代码已经部署到生产系统中。因此,我重构的代码必须与那里的架构/数据向后兼容,并且在未来的一个版本之前我无法开始从子类表中删除冗余列。不管你喜欢与否,我将在一个发布周期的父表和子表之间保留重复的列。

对我来说幸运的是,当 hibernate 发现父表和子表之间存在重复列时,它不会崩溃。但坏消息是它不会更新两个表中的重复列。父表中的列已更新,但子表中的列已过时。

为了与当前代码向后兼容,我希望在两个表中更新该列。这样,如果我们必须回滚版本并返回到旧模式,对实体的更新就不会丢失。虽然我知道我可以通过触发器来解决这个问题,但我正在寻找一种纯代码解决方案,因为触发器有一个在雷达下飞行的讨厌习惯。

有没有人可以告诉我一种方法来说服 hibernate 同时命中两列?

我的类(class)的一个非常人为的例子是:

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

@Id @Generated
Long id;
boolean duplicate;
}

@Entity
@Table(name = "subclass")
public class SubClass extends SuperClass {
String otherProperty;
}

与要匹配的表格:

CREATE TABLE superclass (
id INT PRIMARY KEY AUTO_INCREMENT,
duplicate BOOLEAN
);

CREATE TABLE subclass (
id INT NOT NULL,
duplicate BOOLEAN,
otherProperty VARCHAR(255),
FOREIGN KEY (id) REFERENCES superclass(id)
);

插入新的子类实体时,子类表上的重复列将为 NULL。

非常感谢!

最佳答案

如何在代码中定义两个属性,将一个属性映射到每一列,然后在代码中保持它们同步?一种是实物属性(property),一种是影子属性(property)。它不太漂亮,但应该仅限于一个类(或一个类及其父类(super class))的实现。

当您能够删除列时,您可以删除阴影属性。

关于java - 使用 Hibernate 连接子类,是否可以复制 super 表和子表中的列*并*保持它们同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6047273/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com