使用Hibernate将Java类添加到JPA中的现有继承层次结构中

时间:2014-06-05 16:30:26

标签: java hibernate inheritance jpa

我有一个带有现有子类的抽象基类,主要用于定义许多公共字段和相关方法。我有一个单独的具体课程,有机地进化了#34; (即由于不可预见的特征请求导致设计不良)最终得到该抽象子类中定义的所有相同字段。

有没有办法让这个单独的类扩展抽象类并继承该单独类的现有存储实例的数据?我想使用InheritanceType.SINGLE_TABLE,但如果另一种策略使其更容易或可能,我想这也很好。

此外,这些是在其他实体(OneToMany)中引用的实体。那是问题吗? Hibernate只使用一个全局序列来分配实体ID - 因此理论上即使将数据移动到另一个表,理论上也可以不破坏这些引用,对吗?

已经尝试了一些东西,但到目前为止没有运气(例如,将" extend"添加到单独的类中,硬编码使用与基类相同的表,手动添加字段对于鉴别者......)。

关于如何使用JPA / Hibernate执行类层次结构更改和其他数据模型更改而不丢失数据的示例/文档的任何指针我也很高兴!


所以,这是一个简化的情况示例。 Base是已经有子类的抽象基类。

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "Base")
public abstract class Base {
    private long persistenceId;

    private String privateField;

    @Id
    @GeneratedValue
    public long getPersistenceId() {
        return persistenceId;
    }

    public void setPersistenceId(long persistenceId) {
        this.persistenceId = persistenceId;
    }

[...]
}

@Entity
public class SubclassToBe {
    private long persistenceId;

    private String privateField;

    private String someFieldNotInBaseClass;

    @Override
    @Id
    @GeneratedValue
    public long getPersistenceId() {
        return persistenceId;
    }

    @Override
    public void setPersistenceId(long persistenceId) {
        this.persistenceId = persistenceId;
    }

[...]
}

目标是让SubclassToBe从Base继承,删除共享字段的定义,但保留存储在那里的信息。同时,不要破坏对作为OneToMany关系的一部分的其他对象中使用的SubclassToBe对象的持久性ID的引用。

0 个答案:

没有答案