2

所以我有一个有趣的情况。我继承了一大堆代码,最初的开发人员决定放弃使用继承来支持枚举和 switch 语句......这是这种反模式的完美示例 现在是重构的时候了,我已经决定了最好的解决方法是提取一个由具有共享列的表支持的超类,然后使用连接的子类继承策略。到目前为止,一切都很好...

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

对我来说幸运的是,当它看到父表和子表之间有重复的列时,hibernate 并没有翻转。但坏消息是它不会更新两个表中的重复列。父表中的列已更新,但子表中的列已过时。

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

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

我的课程的一个非常人为的例子是:

@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。

非常感谢!

4

1 回答 1

1

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

当您能够删除该列时,您可以删除 shadow 属性。

于 2011-05-18T15:46:25.433 回答