Java Hibernate继承映射问题

Java Hibernate继承映射问题,java,sql,hibernate,inheritance,polymorphism,Java,Sql,Hibernate,Inheritance,Polymorphism,所以,经过几次尝试,并试图使这项工作的方式,我想要的,当然检查不同的指南,我现在来给你们 我的程序是这样设计的: persona: persona_id (PK-autoincemental) empleado: persona_id (FK to persona) legajo_id empvarios: persona_id (FK to persona) ocupacion_id 父客体人格 -数据库上的个人cuil pk,由用户生成 雇佣人格的儿子 -由非DB程序生成的DB上的l

所以,经过几次尝试,并试图使这项工作的方式,我想要的,当然检查不同的指南,我现在来给你们

我的程序是这样设计的:

persona:
persona_id  (PK-autoincemental)

empleado:
persona_id (FK to persona)
legajo_id

empvarios:
persona_id (FK to persona)
ocupacion_id
父客体人格 -数据库上的个人cuil pk,由用户生成

雇佣人格的儿子 -由非DB程序生成的DB上的legajo_id pk也无法工作 -人物角色

empvarios empleado的儿子 -来自empleado的legajo_id PK和FK

现在,数据库以这种方式映射,并且工作正常,问题似乎是hibernate在某处混合了发送到每个对象的主键,而不是在empvarios中插入legajo_id,而是插入了一个persona_cuil

类别代码:

人物角色:

@Entity
@Table(name = "persona")
@Inheritance(strategy = InheritanceType.JOINED)
public class persona implements Serializable {

    private static final long serialVersionUID = 2847733720742959767L;
    @Id
    @Column(name="persona_cuil")
    private String persona_cuil;
    @Column(name="nombre")
    private String nombre;
    @Column(name="apellido")
    private String apellido;
    @Column(name="fecha_nac")
    private String fecha_nac;
    @Column(name="direccion")
    private String direccion;
    @Column(name="localidad")
    private String localidad;
    @Column(name="provincia")
    private String provincia;
    @Column(name="pais")
    private String pais;
    @Column(name="fecha_muerte")
    private String fecha_muerte;
    @Column(name="fecha_alta")
    private String fecha_alta;
    @Column(name="fecha_baja")
    private String fecha_baja;
    @Column(name="mail")
    private String mail;
    @Column(name="plan_id")
    private int plan_id;

    public persona (){
        this.setPlan_id(0);
    }
//Getters and Setters
}
雇员:

@Entity
@Table(name = "empleado")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name="persona_cuil")
public class empleado extends persona implements Serializable {

    private static final long serialVersionUID = -7792000781951823557L;

    @Column(name="legajo_id")
    private int legajo_id;

    public empleado(){
        super();
        int leg = SentenceManager.ultimoRegistro("empleado");
        if (leg == 0){ //this works fine, it just searches the last registry, if it exists, i uses the next available number
            this.setLegajo_id(1);
        }
        else {
            this.setLegajo_id(leg+1);
        }
    }
//Getters and Setters
}
empvarios:

@Entity
@Table(name="empvarios")
@PrimaryKeyJoinColumn(name="legajo_id")
public class empvarios extends empleado implements Serializable, ToPersona{

    private static final long serialVersionUID = -6327388765162454657L;

    @Column(name="ocupacion_id")
    int ocupacion_id;

    public empvarios() {
        super();
        this.setLegajo_id(super.getLegajo_id());
    }
//Getters and setters
}
现在,如果我尝试在数据库中插入一个新的emplbeado,它工作得很好。。。但是,如果我尝试在应该是legajo_id的地方插入empvarios,hibernate会通过删除数据库上的FK限制来放置我测试过的persona_cuil

下图: 由于声誉限制,无法发布图像:/ 这是3张照片,文件名显示了每张照片的表格


有什么想法吗?

问题是数据库映射错误

如果有人有这个问题,那么你必须重新考虑数据库的结构

如我上面给出的示例所示,数据库应如下所示:

persona:
persona_id  (PK-autoincemental)

empleado:
persona_id (FK to persona)
legajo_id

empvarios:
persona_id (FK to persona)
ocupacion_id
这样做的原因是,您不能使用不同的ID来依赖数据库中的不同类别。在程序方面,它可以像那样工作,但它必须以不同的方式映射数据库

谢谢