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

Java 使用Hibernate连接的子类,是否可以复制超级表和子表中的列*并*使它们保持同步?,java,hibernate,joined-subclass,Java,Hibernate,Joined Subclass,所以我有一个有趣的情况。我继承了一大堆代码,最初的开发人员决定放弃使用继承,转而使用enum和switch语句……这是一个完美的例子,说明现在是重构的时候了,我已经决定了最好的方法是拉出一个由共享列表支持的超类,然后使用连接子类继承策略。到目前为止还不错 现在棘手的是,这段代码已经部署到生产系统中。因此,我的重构代码必须与现有的模式/数据向后兼容,并且在将来的某个版本之前,我不能从子类表中删除冗余列。不管你喜欢与否,我将在一个发布周期的父表和子表之间创建重复的列 幸运的是,当hibernate看

所以我有一个有趣的情况。我继承了一大堆代码,最初的开发人员决定放弃使用继承,转而使用enum和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


非常感谢

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


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

我认为查看一些代码和SQL会有所帮助。@Tom谢谢……我用简化的代码更新了我的问题。嗯……虽然我确信这会起作用,但会有很多代码重复。我希望我可以调用一些hibernate魔法来更新这两个列。是的,重写子类中的原始属性设置器,以便它同时更新原始属性和“影子”属性。正确地封装阴影属性,使其自身不会发生变异。嗯,我希望有一些神奇的东西。这是我能想到的唯一代码解决方案。虽然最后,我们决定用一种更简单的方法来解决这个问题……如果我们必须回滚,我们只需运行一个SQL脚本来备份复制列。有时,组织解决方案比代码解决方案更好这听起来是一个比用代码修复好得多的解决方案。事实上,你应该把它作为一个答案贴出来并接受它!