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