Java 如何在不向超类添加另一个实例的情况下插入子类?

Java 如何在不向超类添加另一个实例的情况下插入子类?,java,hibernate,jpa,inheritance,hql,Java,Hibernate,Jpa,Inheritance,Hql,我对类使用标准的JpaRepository接口 我有以下课程: 用户: @Entity @Table(name = "user") @Inheritance(strategy = InheritanceType.JOINED) public class User extends BaseEntity { private Long id; //Other Attr @Id @GeneratedValue(strategy = GenerationType.AUT

我对类使用标准的JpaRepository接口

我有以下课程:

用户:

@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.JOINED)
public class User extends BaseEntity {

    private Long id;
    //Other Attr

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }
    //Getters & Setters...
}
医生:

@Entity
@Table(name = "doctor")
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="id")
public class Doctor extends User {

    private Long regNumber;
    //Getters & Setters
}
我在搜索,jpa/hibernate似乎没有插入医生的功能/过程,其中包含来自现有用户的信息

我试图用用户查询中的信息保存医生,它为用户表创建了一个新的用户条目

从理论上讲,一个人可以成为用户而不是医生,以后可以成为医生

从理论上讲,一个人可以成为用户而不是医生,以后可以成为医生

这在现实生活中是正确的,但Java继承则不然:给定类型的对象不能成为另一种类型的对象。如果您想对这种情况建模,继承是一个糟糕的工具

你应该改用构图。用户可以具有医生角色。这是一个OneTONE关联,可以使用与用于映射继承的表相同的表来映射,并允许用户成为医生


它也是更好的设计,因为它允许多个角色:例如,用户是医生和音乐家。继承也不可能做到这一点。

我认为这是不可能的,因为用户不能被转换为医生。相反,医生可能已经是用户。你是说组合与角色的关联吗?我的意思是一个用户有一个角色,可以是用户或医生?像spring安全角色一样?不。我的意思是,您应该忘记inheritace,将doctor表映射到DoctorRole实体,并在用户和DoctorRole之间建立OneToOne关联。如果用户有一个DoctorRole,那么他就是一个医生。如果用户没有DoctorRole,那么他就不是医生。谢谢。我在想忘记遗产的事。