Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Hibernate将Java类添加到JPA中现有的继承层次结构中_Java_Hibernate_Inheritance_Jpa - Fatal编程技术网

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

使用Hibernate将Java类添加到JPA中现有的继承层次结构中,java,hibernate,inheritance,jpa,Java,Hibernate,Inheritance,Jpa,我有一个包含现有子类的抽象基类,主要用于定义一些公共字段和相关方法。我有一个单独的具体类,它“有机地进化”(也就是说,由于不可预见的特性请求而导致糟糕的设计),最终在该抽象子类中定义了所有相同的字段 有没有办法让那个单独的类扩展抽象类并继承那个单独类的现有存储实例的数据?我想使用InheritanceType.SINGLE_表,但如果另一种策略使它更容易或可能,我想也可以 此外,这些是在其他实体(OneToMany)中引用的实体。这是个问题吗?Hibernate只使用一个全局序列来分配实体ID—

我有一个包含现有子类的抽象基类,主要用于定义一些公共字段和相关方法。我有一个单独的具体类,它“有机地进化”(也就是说,由于不可预见的特性请求而导致糟糕的设计),最终在该抽象子类中定义了所有相同的字段

有没有办法让那个单独的类扩展抽象类并继承那个单独类的现有存储实例的数据?我想使用InheritanceType.SINGLE_表,但如果另一种策略使它更容易或可能,我想也可以

此外,这些是在其他实体(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;
    }

[...]
}

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

您是否尝试过中所述的
@MappedSuperclass
?仅在一个小示例项目中尝试过,它将要集成的类的所有实例从其表中删除,我得到一个列索引超出范围的错误。嗯,这很不幸。也许提供一个简单的(代码)例子来说明你想要实现什么/这个问题会吸引一些有更深入知识的人来回答。