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

标签 java hibernate joined-subclass

所以我遇到了一个有趣的情况。我继承了一大堆乱七八糟的代码,原始开发人员决定放弃使用继承,转而使用枚举和 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/

相关文章:

java - 没有 Spring,Hibernate 有意义吗?

java - 有没有办法在 JPA 中使用鉴别器值与实体继承建立双向关系?

nhibernate - 如何在 Fluent NHibernate 中建模此对象层次结构而不违反 DDD 原则?

java - 如何在 OpenNLP 中初始化 token 模型?

java - Hibernate 中的默认关联(或映射)是什么?

java - 为什么每次保存父对象时子实体都会在数据库中重复

java - try/catch 包含 for + if + switch 语句、break;需要在包含 switch 的 for 循环中包含 if 语句之后,为什么?

java - 用加法得到的数是一样的吗?

java - 自动化集成测试 : Use xUnit?